随着java8我们知道使用ZoneId.default()
可以得到系统默认的ZoneId
,但如何让默认ZoneOffset
?
我看到,ZoneId
有一些“规则”和每个规则有一个ZoneOffset
,是手段ZoneId
可能有不止一个ZoneOffset
?
OffsetDateTime.now().getOffset()
但是,你可能应该使用一个时区,而不是一个单纯的偏移,从-UTC。
ZoneId.systemDefault()
一个偏移从-UTC仅仅是数量的小时,分钟和秒-仅此而已。例如,-08:00
是指UTC落后8小时,+05:45
即五个小时45领先分钟UTC。
一个时区是过去,现在和未来的偏移量变化的历史使用由特定地区的人们。异常,如夏令时(DST)造成的时间抵消了特定时期的变化进行跟踪随着时间的推移,在过去,因为他们发生的事情,并在未来当政客纷纷宣布计划变更。
所以最好使用区域知时。
偏移的任何区域随时间变化。例如,DST在美国移动通过一个小时的偏移量大约一半的一年,然后恢复在今年的另一半小时回抵消。一个时间区的整个目的是在偏移来记录这些变化。
所以,它真的是没有意义的,要求一个没有日期,时间偏移。在America/Los_Angeles
,例如在今年的一部分偏移-08:00
,但在今年的另一部分是-07:00
DST期间。
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
这种now
方法实际上是将隐含JVM的当前默认时区。我建议你总是通过指定所需/预期的时区明确。即使你想在当前默认的区域,所以说明确地让你的意图明确。消除你是否打算在默认或者没有考虑到时区经常有程序员会发生歧义。呼叫ZoneId.systemDefault
。
OffsetDateTime odt = OffsetDateTime.now ( ZoneId.systemDefault () );
ZoneOffset zoneOffset = odt.getOffset ();
。ZoneId.systemDefault()的toString():美洲/洛杉矶
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 [美国/蒙特利尔]
zoneOffsetXmas.toString():-05:00
zoneOffsetXmas.getTotalSeconds():-18000
ZoneId
作为由yanys的评论所说,你可以询问一个ZoneId
特定ZoneOffset
通过传递一个时刻作为Instant
。该Instant
级表示时间轴上的时刻UTC,分辨率为纳秒(最多小数的9个位数)。
这仅仅是到同一目的地另一条路线。就像用OffsetDateTime
和ZonedDateTime
上面所讨论的,我们指定(一)一个时区,以及(b)一个时刻。
Instant instant = zdtXmas.toInstant();
ZoneOffset zo = z.getRules().getOffset( instant );
对于了zoneid:美国/蒙特利尔瞬间:2017-12-25T05:00:00Z的ZoneOffset为:-05:00
查看所有这些例子代码在现场IdeOne.com。
ZoneOffset.systemDefault
- 错误或功能?的ZoneOffset
类,的一个子类ZoneId
,被记录为继承systemDefault
方法。然而,这并不实际工作。
ZoneOffset zoneOffset = ZoneOffset.systemDefault() ; // Fails to compile.
错误:不兼容的类型:可以了zoneid不能转换为ZoneOffset
不知道这失败到编译是一个错误或功能。如上所述,它似乎没有意义的,我不会要求用默认的日期,时间偏移,所以也许ZoneOffset.systemDefault
确实应该失败。但文档应该这么说,有一个解释。
我试图向在DOC未能解决这个问题的一个错误,但放弃了,不能确定在哪里以及如何提交这样的错误报告。
多一点关于偏移量和时区...
太阳时自前的历史已被使用,通过跟踪注意每天,当太阳在头顶。戳在地上一棒,看它的身影。当影子最短,当阴影开始生长,而不是收缩,那么你知道它现在是中午。正式与日晷跟踪时间过去了。
随着太阳能的时候,当你从城镇到另一个城镇向西移动,中午到达有点晚。东移,中午到达有点早。所以,每一个城市都有自己的中午,只有城镇南北沿同一经度共享。
太阳时在当今时代主要被摒弃了。火车,电报,并且到达了电话,所以没有需要时间协调。因此,一个点入选了中午的其近太阳时,土地这么多英里的西部和东部的大片被宣布为所有共享上的时钟一样12时,同样的时间提前偏移或后面格林威治本初子午线线。于是开始每列火车停止显示醒目的时钟,让的城镇知道的传统标准时间为他们更大的区域,而不是太阳的时间为自己的小镇。一般情况下,在该时间段区域的西部边缘城镇会看到他们的火车站时钟读12:00稍前太阳开销。在该地区的东部边缘城镇钟读12:00一点后太阳开销。
世界各地的政治家表现出改变其管辖的偏移量(S)情有独钟。其原因各不相同,如外交,战争和占领,以及的愚蠢夏令时(DST) 。原因各不相同,但他们的变化都以惊人的频率。时区是给一个区域来跟踪其这种变化的历史名称。因此,一个偏移从-UTC仅仅是几个小时,分钟,秒提前或本初子午线后面。一个时区得多:一个历史的过去,现在和未来的一个特定区域的偏移量的变化。虽然两个相邻地区今天可能共享相同的偏移从-UTC,在过去或未来,他们可能会因不同的率性或政治家的逻辑不同。
政治家定义,这意味着现代的时间跟踪有什么与地理。例如,今天印度的大国具有一个时区(偏移从-UTC的+05:30)。所以,正午太阳(太阳直接在你的头上)相距跨越辽阔次大陆各个地方小时。印度的政治家们决定这有利于统一其多样化的民主。在世界各地的其他例子,我们可以看到的区域利用自己的时区是国际关系,如比其犯罪邻国不同,或者选择同一区域作为邻居符号作为关系解冻,最近看到朝鲜改变以匹配韩国。所以,如今,太阳能时间是在时间跟踪的几个因素只有一个。
该java.time框架是建立在Java 8和更高版本。这些类取代麻烦的老传统日期时间类,如java.util.Date
,Calendar
,和SimpleDateFormat
。
该乔达-时间的项目,现在在维护模式,建议迁移到java.time类。
要了解更多信息,请参阅甲骨文教程。和搜索堆栈溢出了很多例子和解释。规范是JSR 310。
你可调换java.time与您的数据库对象直接。使用JDBC驱动程序符合JDBC 4.2或更高版本。无需串,不需要java.sql.*
类。
从哪里获取java.time类?
该ThreeTen-额外项目与其他类扩展java.time。该项目是为将来可能增加的java.time试验场。你可能在这里找到一些有用的类,比如Interval
,YearWeek
,YearQuarter
,和更多。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句