簡體   English   中英

Java ZonedDateTime到即時轉換

[英]Java ZonedDateTime to Instant conversion

我計划按照以下邏輯將ZonedDateTime轉換為即時。

說,我在PST時區,目前的時間是11A.M. 如果我現在轉換(截至2018年3月4日沒有夏令時),toInstant將是7P.M.

對於同樣的上午11點,toInstant將在2018年4月4日下午6點返回,因為將觀察到夏令時。

所以,下面的代碼正確返回。

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然后再添加一個月,結果將會有所不同。

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,它只是從那里添加。

因此,要包括夏令時,我需要添加幾天或幾個月或幾年......到ZonedDateTime然后轉換為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,但它返回7P.M.

dateTime.plusSeconds(org.joda.time.Period.days(1).multipliedBy(10).toStandardSeconds().getSeconds())
         .toInstant())  --> ---> March 14th 2018 at 7P.M

不確定,這有什么問題,以及如何使它工作幾秒鍾。

原因可以在ZonedDateTime類的文檔中找到。 對於方法plusDays我們在方法文檔中看到了這一點:

這在當地時間線上運行,增加了當地日期時間。 然后使用區域ID將其轉換回ZonedDateTime以獲取偏移量。

轉換回ZonedDateTime時,如果本地日期時間處於重疊狀態,則盡可能保留偏移量,否則將使用較早的偏移量。 如果在間隙中,則本地日期時間將按間隙的長度向前調整。

但是,在plusSeconds方法的文檔中,我們看到:

這在即時時間線上操作,使得增加一秒將始終是一秒之后的持續時間。 這可能導致本地日期時間改變不超過一秒的量。 請注意,這與日,月和年使用的方法不同。

因此,這兩種方法的設計行為不同,在選擇使用哪種方法以滿足您的目的時需要考慮這一點。

據我了解您的要求,您可以在幾分鍾或幾小時內添加時間

    long minutesToAdd = Duration.ofDays(10).toMinutes();

我正在使用java.time,因為我沒有使用Joda-Time的經驗。 如果你願意,也許你可以把我的想法翻譯成Joda-Time。

我進一步了解,添加上述分鍾的結果應該是分鍾后的分鍾數。 相反,它應該與添加10天相同。 因此,如果它在加利福尼亞州的晚上9點,那么10天后你想在加利福尼亞州的晚上9點。 我建議您在添加分鍾或小時之前轉換為LocalDateTime ,然后轉換回ZonedDateTime

    ZonedDateTime now = ZonedDateTime.now(ZoneId.of("America/Los_Angeles"));
    System.out.println(now);
    System.out.println(now.toInstant());
    Instant inTenDays = now.toLocalDateTime()
            .plusMinutes(minutesToAdd)
            .atZone(now.getZone())
            .toInstant();
    System.out.println(inTenDays);

這只是印刷

2018-03-04T21:16:19.187690-08:00[America/Los_Angeles]
2018-03-05T05:16:19.187690Z
2018-03-15T04:16:19.187690Z

由於夏令時(DST)於3月15日(今年3月11日起)生效,因此您不會在UTC中獲得相同的時段,而是在您的時區中獲得相同的時段。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM