繁体   English   中英

如何将字符串格式的给定日期视为 est 并将其转换为 java 中的 utc?

[英]How can I consider given date in string format as est and convert it to utc in java?

我有一个字符串格式的String date = "2021-04-26 08:28:56 "

现在,我想将此视为 EST 日期并将其转换为 UTC。

UTC 将是"2021-04-25 10:58:56"

所以,

输入:

2021-04-26 08:28:56

Output:

2021-04-25 10:58:56

如何在 Java 中做到这一点?

tl;博士

LocalDateTime
.parse(
    "2021-04-26 08:28:56"
    .replace( " " , "T" )
)
.atZone(
    ZoneId.of( "America/New_York" )
)
.toInstant()
.toString()
.replace( "T" , " " )
.replace( "Z" , "" )

请参阅在 IdeOne.com 上实时运行的代码

2021-04-26 12:28:56

您的预期结果不正确。 如果EST指的是诸如America/New_York之类的时区,那么此时该时区比 UTC 晚四个小时 因此,要从上午 8 点开始,您必须增加4 小时,才能获得中午 12 点,而不是前一天预期的上午 10 点。

细节

将您的输入解析为LocalDateTime ,因为它缺少时区指示符或与 UTC 的偏移量。 我们通过用T替换中间的空格来转换您的输入以符合 ISO 8601。

LocalDateTime不代表时刻,也不是时间线上的一个点。 此 class 仅表示日期和时间。 如果没有时区的上下文或与 UTC 的偏移,我们不知道那个时间点在哪个时钟。

您声称知道此字符串旨在表示EST中看到的日期时间。 不幸的是, EST不是实时时区名称 您是指北美的东海岸时间,例如America/New_York吗? 如果是这样,您预期的 output 是不正确的。

如果是,请获取该时区的ZoneId 应用时区以获得ZonedDateTime 现在我们已经定义了一个时刻,时间线上的一个特定点。

您想在 UTC 中看到同一时刻。 适应 UTC 的一种简单方法是从ZonedDateTime object 中简单地提取Instant 根据定义, Instant object 始终采用 UTC。

您所需的 output 类似于InstanttoString方法中默认使用的标准ISO 8601格式。 只需从日期和时间之间删除T ,并删除最后代表零时分秒偏移量的Z 顺便说一句,我建议不要删除Z以使含义一目了然。 删除Z会引入歧义。

String input = "2021-04-26 08:28:56".replace( " " , "T" ) ;
LocalDateTime ldt = LocalDateTime.parse( input ) ;
ZoneId z = ZoneId.of( "America/New_York" ) ;
ZonedDateTime zdt = ldt.atZone( z ) ;
Instant instant = zdt.toInstant() ;  // Adjust to UTC by extracting an `Instant` object. `Instant` is always in UTC, by definition.
String output = instant.toString().replace( "T" , " " ).replace( "Z" , "" ) ;

关于java.time

java.time框架内置于 Java 8 及更高版本中。 这些类取代了麻烦的日期时间类,例如java.util.DateCalendarSimpleDateFormat

要了解更多信息,请参阅Oracle 教程 并在 Stack Overflow 上搜索许多示例和解释。 规范是JSR 310

现在处于维护模式Joda-Time项目建议迁移到java.time类。

您可以直接与数据库交换java.time对象。 使用符合JDBC 4.2或更高版本的JDBC 驱动程序 不需要字符串,不需要java.sql.*类。 Hibernate 5 & JPA 2.2 支持java.time

从哪里获得 java.time 课程?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM