簡體   English   中英

從 java.time.LocalDate 轉換為 java.util.Date 會導致亞洲/加爾各答時區的時間戳不正確

[英]Converting from java.time.LocalDate to java.util.Date results in incorrect timestamp in Asia/Kolkata time zone

在將java.time.LocalDate對象轉換為java.util.Date對象時,當系統時區設置為Asia/Kolkata / IST時,它適用於 LocalDate > 1900-01-02 。

但是對於 LocalDate <= 1900-01-01,它會導致偏移 8 分 50 秒。

import java.time.*;
import java.util.*;

TimeZone.setDefault(TimeZone.getTimeZone("Asia/Kolkata"));
Instant i1 = LocalDate.of(1900,1, 1).atStartOfDay(ZoneId.systemDefault()).toInstant();
Instant i2 = LocalDate.of(1900,1, 2).atStartOfDay(ZoneId.systemDefault()).toInstant();

System.out.println(Date.from(i1));
System.out.println(Date.from(i2));

輸出:

Mon Jan 01 00:08:50 IST 1900
Tue Jan 02 00:00:00 IST 1900

人們可以注意到 1 月 1 日的08:50分和秒,因為它被正確設置為 1 月 2 日的00:00 。這似乎與 1 月 1 日有關,IST 中的 1900 年落在 UTC 的較早年份,即1899 年 12 月 31 日。

https://www.timeanddate.com/time/zone/india報道,該國自 1947 年起正式采用印度標准時間 (IST)。然而,UTC+5:30 偏移已被用作當地標准時間自 1906 年以來的印度。但令人驚訝的是,它適用於 UTC 年份為 1900 的任何日期。

當時區設置為Asia/Kolkata / IST時,有沒有辦法將 1900-01-01 LocalDate 正確轉換為 Date ?

通過在線資源挖掘,我偶然發現了解釋該行為的JDK-8061577 這是因為java.util.Calendar支持Julian-Gregorian歷,而較新java.time.*類支持ISO 8601日歷(即Proleptic-Gregorian歷)。 由於使用的日歷不同,因此在根據日歷規則從一種類型轉換為另一種類型時可能會觀察到差異。

幸運的是,日歷生成器允許將日歷類型設置為 ISO 8601,這可以用作解決方法。 因此,以下代碼片段對我們有用:

Date date = new Calendar.Builder().setCalendarType("iso8601")
                .setDate(localDate.getYear(), localDate.getMonthValue() - 1, localDate.getDayOfMonth())
                .build()
                .getTime();

暫無
暫無

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

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