首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何将Java日期转换为OffsetDateTime?

如何将Java日期转换为OffsetDateTime?
EN

Stack Overflow用户
提问于 2018-10-10 00:28:52
回答 1查看 0关注 0票数 0

eta值是OffsetDateTime,我有一个DateDate类型的scheduledDate。如果未设置eta,我想回到日期。这个日期的一个例子是Tue Jul 21 10:32:28 PDT 2020。为了转换它,我试着这样做:OffsetDateTime.ofInstant(dto.getScheduledTime().ToInstant(), ZoneOffset.UTC) 感觉就像utc偏移是错误的,因为Date已经有了PDT,但同时它也不是像“America / Los_Angeles”那样的timezoneId。

我对如何处理这个有点困惑。

EN

回答 1

Stack Overflow用户

发布于 2018-10-10 09:46:51

OffsetDateTime target , eta ;   // Modern java.time class.
java.util.Date scheduledDate ;  // Terrible legacy class.


if( Objects.isNull( eta ) ) {   // If no eta, fall back to scheduledDate.
    target = scheduledDate.toInstant().atOffset( ZoneOffset.UTC ) ; // Never use legacy class `java.util.Date` -- when encountered, immediately convert to modern `java.time.Instant`. 
} else {  // Else not null.
    target = eta ;
}
return target ;

最好完全避免java.util.Date。遇到时,立即转换为现代类Instant,并忘记所有关于该Date对象。

OffsetDateTime target, eta, scheduled ;
scheduled = incomingJavaUtilDate.toInstant().atOffset( ZoneOffset.UTC ) ;

target = Objects.isNull( eta ) ? scheduledDate : eta ;  // Ternary operator. Short way of saying: If eta is null, go with scheduledDate, otherwise go with eta. 
return target ;

Date::toString

首先,要了解java.util.Date代表UTC的时刻,始终是UTC †。但是,它的toString方法具有动态应用JVM当前默认时区的非常混乱的反特征。这会产生Date具有时区的错误印象,而事实上它并非†。

避免遗留日期时间类

其次,你将这些非常好的现代java.timeclasses(OffsetDateTime)与非常糟糕的遗留日期时间类(Date)混合在一起。不要这样做。完全避免遗留类。它们在2014年被JSR 310采用后被淘汰。

使用java.time

如果交了一个java.util.Date对象,立即转换为java.time。调用添加到旧类的新转换方法。该Instant班可直接替换Date,作为UTC了一下,但纳秒与毫秒更高的分辨率。

Instant instant = myJavaUtilDate.toInstant() ;  // Convert from legacy class to modern class.

您通常应该跟踪UTC中的时刻。您可以将其设置为Instant或将OffsetDateTime其偏移设置为ZoneOffset.UTC常量。

OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC ) ;  // Same moment, no change in meaning whatsoever. 

具体来说,对于UTC,我们的代码instantodt代码之间没有区别。它们都代表了UTC时刻。不同之处在于OffsetDateTime(a)可以携带替代的UTC偏移值(小时 - 分钟 - 秒),(b)更灵活,例如以标准ISO 8601以外的格式生成文本。

了解到UTC偏移量仅仅是小时数,分钟数和秒数。而已。一个时区,与此相反,是了。时区是特定地区人民使用的偏移的过去,现在和将来变化的历史。例如,使用America/Los_Angeles时区的人们每年两次更改其偏离UTC的偏差,这是一种愚蠢的做法,称为夏令时(DST),从-08:00到-07:00再返回。

因此,通常时区优于仅仅偏移。例如,要看到Date我们Instant通过美国西海岸大多数人使用的挂钟时间,请将时区America/Los_AngelesZoneIdInstant应用于获取a ZonedDateTime

ZoneId z = ZoneId.of( "America/Los_Angeles" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;

你可以通过提取一个回到UTC Instant

Instant instant = zdt.toInstant() ;

然后从那里回到java.util.Date(如果你必须,否则避免)。

java.util.Date d = java.util.Date.from( instant ) ;

†实际上,这个java.time.Date班级确实有一个深埋在里面的时区。缺乏任何访问器(获取/设置)方法,它是无法访问的。它的行为与我们在这里的讨论无关。混乱?是。避免可怕的遗留日期时间类别的另一个原因

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100005058

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档