在给定时区中将日期截断为一天的开始

Truncate date to start of the day in a given timeZone

我希望将给定 timeZone 的日期时间截断为 一天的开始 。 如果当前时间是 Mon Aug 24 15:38:42 America/Los_Angeles,则应将其截断为当天的开始时间 Mon Aug 24 00:00:00 America/Los_Angeles,然后应将其转换为等效的 UTC 时间。

我已经探索了 Joda Time Library, Apache Commons Library and ZonedDateTime 提供的方法,但所有方法都会截断 UTC 中的日期时间,而不是特定时区。

有人可以帮我解决这个问题吗?提前致谢。

您可以使用 ZonedDateTime。在 ZonedDateTime 上使用 toLocalDate() 获得 LocalDate,然后在 LocalDate 上使用 atStartOfDay 并使用区域 ZonedDateTime 实例获得一天的开始。

示例:

ZonedDateTime now = ZonedDateTime.now(ZoneId.of("America/Los_Angeles"));
ZonedDateTime startOfDay = now.toLocalDate().atStartOfDay(now.getZone());

DateTimeFormatter formatter = DateTimeFormatter.RFC_1123_DATE_TIME;
System.out.println(now.format(formatter));         // Mon, 24 Aug 2020 10:41:41 -0700
System.out.println(startOfDay.format(formatter));  // Mon, 24 Aug 2020 00:00:00 -0700

ZonedDateTime 在其自己的时区截断。所以它可以比目前接受的答案更简单一些(这也是一个很好的正确答案)。

    ZonedDateTime given = ZonedDateTime.of(2020, 8, 24, 15, 38, 42, 0, ZoneId.of("America/Los_Angeles"));
    ZonedDateTime startOfDay = given.truncatedTo(ChronoUnit.DAYS);
    System.out.println("Truncated to start of day: " + startOfDay);
    
    Instant inUtc = startOfDay.toInstant();
    System.out.println("In UTC: " + inUtc);

输出为:

Truncated to start of day: 2020-08-24T00:00-07:00[America/Los_Angeles]
In UTC: 2020-08-24T07:00:00Z