java - 如何在java 8中将UTC日期转换为UTC OffsetDateTime?

标签 java java-time date

如何在 Java 中将 UTC 格式的日期对象转换为 UTC 格式的 OffsetDateTime 对象?此逻辑应该编写在时区可以完全不同的微服务上。所以我猜 .now() 和其他事情都被排除了。另外,我不想在任何地方将时区作为参数传递。

示例代码:

public OffsetDateTime convertFrom(Date source) {
    LOGGER.info("source: " + source.toString());
    LOGGER.info("instant: " + source.toInstant().toString());
    LOGGER.info("response: " + source.toInstant().atOffset(ZoneOffset.UTC).toString());
    return source.toInstant().atOffset(ZoneOffset.UTC);
}

我得到的输出是:

  • 来源:2018-07-11 15:45:13.0

  • 即时:2018-07-11T19:45:13Z

  • 回复:2018-07-11T19:45:13Z

我希望输入的输出返回为 2018-07-11 15:45:13Z 2018-07-11 15:45:13.0

最佳答案

tl;博士

java.util.DateInstant 都代表UTC 中的某个时刻。其他时区和偏移量无关紧要。

Instant instant = myJavaUtilDate.toInstant() 

How can I convert the date object which is already in UTC to an OffsetDateTime Object in UTC itself in Java?

您不需要OffsetDateTime。使用 Instant 如上所示。

使用ZonedDateTime,而不是OffsetDateTime

您不需要OffsetDateTime。相对于 UTC 的偏移量仅仅是小时数和分钟数。不多不少。相比之下,时区是特定地区的人们使用的偏移量的过去、现在和 future 变化的历史。因此,时区(如果已知)总是优于单纯的偏移量。因此,尽可能使用 ZonedDateTime 而不是 OffsetDateTime

仅当给定 UTC 偏移量(例如 +02:00)且没有特定时区的上下文(例如 )时才使用 OffsetDateTime欧洲/巴黎

日期转换为即时

如果给定一个java.util.Date,则与替换那个麻烦的旧类的现代类(Instant)协调一致。两者都将 UTC 中的时刻表示为来自 UTC 1970 年第一个时刻的同一纪元引用的计数。现代类解析为纳秒而不是毫秒。要进行转换,请调用添加到旧类中的新方法。

Instant instant = myJavaUtilDate.toInstant() ;

请记住,java.util.DateInstant 始终 代表 UTC 中的某个时刻。

捕捉当前时刻,“现在”

捕获 UTC 中的当前时刻。

Instant instant = Instant.now() ;

now() and other things are ruled out, I guess.

不,您可以随时在任何机器上调用 Instant.now() 来捕获当前时刻。 JVM 当前的默认时区无关紧要,因为 Instant始终 采用 UTC。

从 UTC 调整到另一个时区。 同一时刻,时间轴上的同一点,不同的挂钟时间。 <—这是本次讨论中要理解的最重要的概念!

ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
ZonedDateTime zdt = instant.atZone() ;

作为快捷方式,您可以在捕捉当前时刻时跳过即时。

ZonedDateTime zdt = ZonedDateTime.now( z ) ;

通过提取 Instant 对象移回 UTC。

Instant instant = zdt.toInstant() ; 

提示:关注 UTC

通常最好在 UTC 中完成大部分工作。存储、记录、调试或交换时刻时,请使用 UTC。当程序员或系统管理员工作时,请忘记自己狭隘的时区;学会用 UTC 思维。再次单击您的办公室,将其设置为 UTC。

避免一直在时区之间切换。坚持使用 UTC。仅在呈现给用户或业务逻辑需要时才调整时区。

关于java - 如何在java 8中将UTC日期转换为UTC OffsetDateTime?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51326102/

相关文章:

ios - swift NSDate AM 和 Pm 格式

java - Android Studio(增加最终变量)

java - 即使在应用程序管理器中也使整个应用程序不可见

java - JLex 是否包含 yymore 函数?

java - System.currentTimeMillis()/1000 如何在 JAVA 中工作

java - DateTimeFormatter 的日期格式问题

javafx - 如何在 OpenJDK7 中使用 JavaFX

java - 如何用LocalDate查询LocalDateTime?

java - 日期格式映射到 JSON Jackson

php - 更改过期日期后的值 PHP MYSQL