问题描述
我打算按照以下逻辑将ZonedDateTime转换为即时。
I am planning to convert ZonedDateTime to instant as per the below logic.
说,我在PST时区,当前时间是11A.M.如果我现在转换(截至2018年3月4日没有夏令时)并且toInstant将是7 P.M。
Say, I am in PST timeZone and the current time is 11A.M. If I convert now( no daylight saving as of today March 04 2018) and the toInstant will be 7P.M.
对于同一个上午11点,toInstant将返回6截至2018年4月4日的PM将被观察为夏令时。
For the same 11 A.M, the toInstant will return 6 P.M as of April 04 2018 as daylight saving will be observed.
因此,以下代码正确返回。
So, The below code returns correctly.
ZonedDateTime dateTime = ZonedDateTime.now(); --->>> March 04th 2018 at 11 A.M PST
dateTime.plusMonths(1).toInstant(); -->> returns April 04th 2018 at 6 PM PST as daylight saving will be observed
但是,
如果我转换为Instant然后再添加一个月,结果会有所不同。
The result will be different if i convert to Instant and then add a month.
Instant dateTime = ZonedDateTime.now().toInstant(); --->>> March 04th 2018 at 7 P.M UTC
dateTime.plus(1,ChronoUnit.MONTHS).toInstant(); -->> returns April 04th 2018 at 7 PM UTC ( but the actual time should be 6 PM UTC ).
这没关系,因为我们已经转换为UTC,它只是从那里添加。
This is ok, as we already converted to UTC and it just adds from there.
因此,要包括夏令时,我需要将天数或月数或年数....添加到ZonedDateTime然后转换为Instant。
Hence, To include the daylight saving time, I need to add days or months or years .... to ZonedDateTime and then convert to Instant.
ZonedDateTime dateTime = ZonedDateTime.now(); ---> March 04th 2018 at 11A.M
dateTime.plusDays(10).toInstant(); ---> March 14th 2018 at 6P.M
dateTime.plusMonths(1).toInstant(); ---> April 04th 2018 at 6P.M
上述代码按预期工作。但是下面的一个没有返回6 P.M,但它返回7 P.M。
The above code works as expected. But the below one is not returning 6P.M, But it returns 7P.M.
dateTime.plusSeconds(org.joda.time.Period.days(1).multipliedBy(10).toStandardSeconds().getSeconds())
.toInstant()) --> ---> March 14th 2018 at 7P.M
不确定,这有什么问题以及如何使其工作使用秒。
Not sure, what is wrong with this and how to make it work with seconds.
推荐答案
原因可在 ZonedDateTime
上课。对于方法 plusDays
,我们在方法文档中看到了这一点:
The cause is found in the documentation for the ZonedDateTime
class. For the method plusDays
we see this in the method documentation:
当转换回ZonedDateTime时,如果本地日期时间处于重叠状态,然后,如果可能,将保留偏移量,否则将使用较早的偏移量。如果在间隙中,本地日期时间将按间隙的长度向前调整。
When converting back to ZonedDateTime, if the local date-time is in an overlap, then the offset will be retained if possible, otherwise the earlier offset will be used. If in a gap, the local date-time will be adjusted forward by the length of the gap.
但是,在文档中我们看到 plusSeconds
方法:
However, in the documentation for the plusSeconds
method we see this:
因此,这两种方法的行为方式不同,在选择适合您目的的方法时,您需要考虑这一点。
So the two methods are designed to behave differently, and you need to consider this when choosing which method to use to suit your purpose.
这篇关于Java ZonedDateTime到即时转换的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!