【问题标题】:UTC time in java? [duplicate]java中的UTC时间? [复制]
【发布时间】:2018-07-26 10:32:28
【问题描述】:

如何在 Java 中获取具有相应时区的任何给定时间和日期的 UTC 值?

例如,我当前的时区是Asia/Kolkata,现在我如何获得1.00 am on 21/07/2018 的UTC 值?

【问题讨论】:

  • 这不可能是不重复的......
  • @lelloman 确实.. 我在看stackoverflow.com/questions/308683/…
  • 您想输入一个日期并指定您的时区,并能看到对应的 UTC 时间吗?
  • 是的,我想提供输入@azro
  • 欢迎来到 Stack Overflow。 As the help page says,您应该在询问之前进行搜索和研究。这样你也可能更快地找到一个好的答案。

标签: java datetime utc datetime-conversion


【解决方案1】:

用于获取 UTC 的当前时间。

 Instant.now()  // Current time in UTC.

用于获取任何所需时区的当前时间。

 ZonedDateTime.now( ZoneId.systemDefault() )   // Current time in your ZoneId.

加尔各答示例:

ZoneId zoneKolkata = ZoneId.of( "Asia/Kolkata" ) ;  
ZonedDateTime zoneDTKolkata = instant.atZone( zoneKolkata ) ;

要调整回 UTC,请从 ZonedDateTime 中提取 Instant

Instant instant = zoneDTKolkata.toInstant() ;

您可以从 UTC 调整到时区。

ZonedDateTime zoneDTKolkata = instant.atZone( zoneKolkata ) ;

【讨论】:

  • 答案应包含对其包含的代码的解释。
  • 添加了解释:)
【解决方案2】:

使用 Java 8 time API 代替旧的 API(即 rajadilipkolli 提出的 Date & SimpleDateFormat 解决方案)

// System time (ie, your operating system time zone)
LocalDateTime ldt = LocalDateTime.of(year, month, day, hour, minute, second);

// Time in Asia/Kolkata
ZonedDateTime kolkata = ldt.atZone(ZoneId.of("Asia/Kolkata"));

// Time in UTC
OffsetDateTime utc = ldt.atOffset(ZoneOffset.UTC);

【讨论】:

  • 这将在 UTC 中给出相同的挂钟时间。我认为提问者在同一时间点之后,但他/她可以更好地分辨。
【解决方案3】:
    DateTimeFormatter formatter = new DateTimeFormatterBuilder()
            .parseCaseInsensitive()
            .appendPattern("h.mm a 'on' dd/MM/uuuu")
            .toFormatter(Locale.ENGLISH);
    ZoneId zone = ZoneId.of("Asia/Kolkata");
    String localDateTimeString = "1.00 am on 21/07/2018";
    Instant i = LocalDateTime.parse(localDateTimeString, formatter)
            .atZone(zone)
            .toInstant();
    System.out.println("UTC value is: " + i);

打印出来:

UTC 值为:2018-07-20T19:30:00Z

我不确定您是否需要将您提供的确切字符串 1.00 am on 21/07/2018 解析为日期时间对象,但以防万一我已经展示了如何。挑战在于am 是小写的。为了指定不区分大小写的解析,我需要通过DateTimeFormatterBuilder

如您所见,代码转换为 Instant,这是在 Java 中表示时间点的现代方式。 Instant.toString 总是以 UTC 格式打印时间。末尾的 Z 表示 UTC。如果您想要一个在 UTC 中更明确的日期时间,您可以使用

    OffsetDateTime odt = LocalDateTime.parse(localDateTimeString, formatter)
            .atZone(zone)
            .toInstant()
            .atOffset(ZoneOffset.UTC);
    System.out.println("UTC value is: " + odt);

输出类似,只有OffsetDateTime 省略秒数,如果它们是 0(零):

UTC 值为:2018-07-20T19:30Z

链接: Oracle tutorial: Date Time 解释如何使用现代 Java 日期和时间 API java.time

【讨论】:

    猜你喜欢
    • 2017-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-01
    • 1970-01-01
    • 2013-12-04
    • 2011-07-09
    相关资源
    最近更新 更多