[英]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 中做到这一点?
LocalDateTime
.parse(
"2021-04-26 08:28:56"
.replace( " " , "T" )
)
.atZone(
ZoneId.of( "America/New_York" )
)
.toInstant()
.toString()
.replace( "T" , " " )
.replace( "Z" , "" )
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 类似于Instant
的toString
方法中默认使用的标准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 8 及更高版本中。 这些类取代了麻烦的旧日期时间类,例如java.util.Date
、 Calendar
和SimpleDateFormat
。
要了解更多信息,请参阅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.