如何在java8中获取默认的ZoneOffset?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了如何在java8中获取默认的ZoneOffset?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4216字,纯文字阅读大概需要7分钟。
内容图文
![如何在java8中获取默认的ZoneOffset?](/upload/InfoBanner/zyjiaocheng/702/fbb4d12a8395453aafd2edbbc1dcfb69.jpg)
使用java8我们知道使用ZoneId.default()可以获得系统默认的ZoneId,但是如何获取默认的ZoneOffset?
我看到ZoneId有一些“规则”,每个规则都有一个ZoneOffset,这是否意味着ZoneId可能有多个ZoneOffset?
解决方法:
TL;博士
OffsetDateTime.now().getOffset()
但您可能应该使用时区而不是仅仅偏离UTC.
ZoneId.systemDefault()
偏移与时区
一个offset-from-UTC只是一个小时,分钟和秒钟 – 仅此而已.
A time zone是特定地区人民使用的偏移的过去,现在和将来变化的历史.时区具有一组规则来处理诸如Daylight Saving Time (DST)之类的异常,这些异常导致在特定时间段内偏移的变化.
时区=(偏差历史规则 – 异常规则)
因此,在知道时更好地使用区域.
任何地区的偏移量随时间而变化.例如,DST in the United States将偏移量移动一个小时约半年,然后将该小时恢复到一年中另一半的偏移量.时区的整个目的是记录偏移量的变化.
因此,在没有日期时间的情况下要求偏移是没有意义的.例如,在America/Los_Angeles年,在今年的部分时间,偏移量为-08:00,但在夏令时期间的另一部分时间为-07:00.
OffsetDateTime
因此,让我们将时刻指定为OffsetDateTime,然后提取ZoneOffset.
OffsetDateTime odt = OffsetDateTime.now ();
ZoneOffset zoneOffset = odt.getOffset ();
odt.toString(): 2017-01-02T15:19:47.162-08:00
zoneOffset.toString(): -08:00
现在的方法实际上是隐式应用JVM的当前默认时区.我建议您始终通过指定所需/预期的时区来明确说明.即使您想要当前的默认区域,也要明确说明您的意图.消除关于您是否打算默认或未能考虑时区的模糊性,因为程序员经常会这样做.拨打ZoneId.systemDefault.
OffsetDateTime odt = OffsetDateTime.now ( ZoneId.systemDefault () );
ZoneOffset zoneOffset = odt.getOffset ();
ZoneId.systemDefault().toString(): America/Los_Angeles
odt: 2017-01-02T15:19:47.162-08:00
zoneOffsetOfOdt: -08:00
关于依赖于默认区域的注意事项:此默认值可随时由JVM中任何线程中的任何代码更改.如果重要,请询问用户预期的时区.
您可以将偏移量作为总秒数询问偏移量.
int offsetSeconds = zoneOffset.getTotalSeconds ();
offsetSeconds: -28800
ZonedDateTime
另一个例子:也许你想知道今年圣诞节在魁北克会有什么补偿.指定时区America / Montreal,获取ZonedDateTime,请求其偏移量作为ZoneOffset对象.
ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate ld = LocalDate.of( 2017 , 12 , 25 );
ZonedDateTime zdtXmas = ld.atStartOfDay( z );
ZoneOffset zoneOffsetXmas = zdtXmas.getOffset();
zdtXmas.toString(): 2017-12-25T00:00-05:00[America/Montreal]
zoneOffsetXmas.toString(): -05:00
zoneOffsetXmas.getTotalSeconds(): -18000
了zoneid
正如yanys的评论中所建议的那样,您可以通过将片刻作为Instant来询问特定ZoneOffset的ZoneId. Instant类代表UTC时间轴上的一个时刻,分辨率为nanoseconds(小数部分最多九(9)位).
这只是通往同一目的地的另一条路线.就像上面讨论的OffsetDateTime和ZonedDateTime一样,我们指定(a)时区,(b)片刻.
Instant instant = zdtXmas.toInstant();
ZoneOffset zo = z.getRules().getOffset( instant );
For ZoneId: America/Montreal at instant: 2017-12-25T05:00:00Z the ZoneOffset is: -05:00
查看所有这些示例’code live at IdeOne.com.
ZoneOffset.systemDefault – 错误或功能?
ZoneOffset类是ZoneId的子类,记录为继承systemDefault方法.但是,这实际上并不起作用.
ZoneOffset zoneOffset = ZoneOffset.systemDefault() ; // Fails to compile.
error: incompatible types: ZoneId cannot be converted to ZoneOffset
不确定这个编译失败是错误还是功能.如上所述,对于我来说,要求使用日期时间的默认偏移似乎没有意义,因此ZoneOffset.systemDefault可能确实会失败.但文档应该这样说,并附上解释.
我试图提交一个关于文档无法解决此问题的错误,但放弃了,无法确定在何处以及如何提交此类错误报告.
关于java.time
java.time框架内置于Java 8及更高版本中.这些课程取代了麻烦的旧legacy日期时间课程,如java.util.Date,Calendar和& SimpleDateFormat.
Joda-Time项目现在是maintenance mode,建议迁移到java.time课程.
要了解更多信息,请参阅Oracle Tutorial.并搜索Stack Overflow以获取许多示例和说明.规格是JSR 310.
您可以直接与数据库交换java.time对象.使用符合JDBC 4.2或更高版本的JDBC driver.不需要字符串,不需要java.sql.*类.
从哪里获取java.time类?
> Java SE 8,Java SE 9,Java SE 10,Java SE 11和更高版本 – 带有捆绑实现的标准Java API的一部分.
> Java 9增加了一些小功能和修复.
>大多数java.time功能都被反向移植到Java 6& 7月在ThreeTen-Backport.
> Android
>更新版本的Android捆绑java.time类的实现.
>对于早期的Android(< 26),ThreeTenABP项目适应ThreeTen-Backport(如上所述).见How to use ThreeTenABP….
ThreeTen-Extra项目使用其他类扩展了java.time.该项目是未来可能添加到java.time的试验场.您可以在这里找到一些有用的类,例如Interval,YearWeek,YearQuarter和more.
内容总结
以上是互联网集市为您收集整理的如何在java8中获取默认的ZoneOffset?全部内容,希望文章能够帮你解决如何在java8中获取默认的ZoneOffset?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。