【问题标题】:How to construct ZonedDateTime from an Instant and a time string?如何从 Instant 和时间字符串构造 ZonedDateTime?
【发布时间】:2015-10-14 02:54:03
【问题描述】:

给定一个Instant 的对象,一个time string 表示特定ZoneId 的时间,如何构造一个ZonedDateTime 对象,其中包含给定时刻的日期部分(年、月、日) ZoneId 和给定 time string 的时间部分?

例如:

给定一个值为 1437404400000 的 Instant 对象(相当于 20-07-2015 15:00 UTC),一个时间字符串 21:00,以及一个代表 Europe/LondonZoneId 对象,我想构造一个相当于 20-07-2015 21:00 Europe/LondonZonedDateTime 对象强>。

【问题讨论】:

  • 如果有的话,您希望日期如何受时间影响?
  • 我想从瞬间中提取日期部分,从字符串中提取时间部分。时间字符串表示指定时区的时间。
  • 但是瞬间没有日期 - 它只是一个时间点,根据时区的不同,它会在不同的日期。基本上看我的帖子有两个选择...
  • 对,从问题中并不清楚 - 请参阅我的回答以了解两种替代解释及其后果。
  • Righto - 我已经将我的答案简化为当时的答案。

标签: java java-8 java-time zoneddatetime


【解决方案1】:

您需要先将时间字符串解析为LocalTime,然后可以使用区域从Instant 调整ZonedDateTime,然后应用时间。例如:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm", Locale.US");
LocalTime time = LocalTime.parse(timeText, formatter);
ZonedDateTime zoned = instant.atZone(zoneId)
                             .with(time);

【讨论】:

    【解决方案2】:

    创建瞬间并确定该瞬间的 UTC 日期:

    Instant instant = Instant.ofEpochMilli(1437404400000L);
    LocalDate date = instant.atZone(ZoneOffset.UTC).toLocalDate();
    
    // or if you want the date in the time zone at that instant:
    
    ZoneId tz = ZoneId.of("Europe/London");
    LocalDate date = instant.atZone(tz).toLocalDate();
    

    解析时间:

    LocalTime time = LocalTime.parse("21:00");
    

    根据所需 ZoneId 的 LocalDate 和 LocalTime 创建 ZoneDateTime:

    ZonedDateTime zdt = ZonedDateTime.of(date, time, tz);
    

    正如 Jon 所指出的,您需要确定您想要的日期,因为 UTC 中的日期可能与当时给定时区中的日期不同。

    【讨论】:

    • 非常感谢您的回答;这很有帮助。
    猜你喜欢
    • 1970-01-01
    • 2019-04-27
    • 1970-01-01
    • 2018-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多