我正在使用“亞洲/曼谷”區域 ID。該偏移量來自 GMT UTC 07:00。
但是當我執行以下操作時,設定“01/01/1900 7:00:00.000”時不是 7:00
SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss.SSS");
Date date = dateFormat.parse("01/01/1900 7:00:00.000");
System.out.println(date);
System.out.println(date.getTimezoneOffset());
Date date2 = dateFormat.parse("01/01/1900 6:00:00.000");
System.out.println(date2);
System.out.println(date2.getTimezoneOffset());
結果是
周一1月1 07:00:00 ICT 1900
-402
周一1月1 06:00:00 ICT 1900
-420
我想知道偏移量是否在 1900 年 1 月 1 日早上 7:00 左右發生了變化,所以我在維基百科上查了一下。 https://en.wikipedia.org/wiki/Time_in_Thailand
那是 UTC 6:42,但從 1880 年到 1920 年。
我有3個問題。
- 為什么在“01/01/1900 7:00:00.000”和“01/01/1900 6:00:00.000”之間發生不同的時間偏移
- 我在哪里可以看到 Java 中的時區歷史記錄。
- 如何忽略同一時區的不同時間偏移。
uj5u.com熱心網友回復:
此處提供了每個版本的 Java 運行時時區資訊 https://www.oracle.com/java/technologies/tzdata-versions.html
在鏈接檔案(對于特定版本)中,您可以找到指向所用實際資料的鏈接
https://www.iana.org/time-zones/repository/releases/tzcode2021a.tar.gz
https://www.iana.org/time-zones/repository/releases/tzdata2021a.tar.gz
https://www.iana.org/time-zones/repository/releases/tzdb-2021a.tar.lz
在里面,tzdata*.tar.gz您可以找到一個名為的檔案asia,其中也包含曼谷的資料。
它包含這些條目
# Thailand
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Asia/Bangkok 6:42:04 - LMT 1880
6:42:04 - BMT 1920 Apr # Bangkok Mean Time
7:00 - 07
Link Asia/Bangkok Asia/Phnom_Penh # Cambodia
Link Asia/Bangkok Asia/Vientiane # Laos
所以 -402 時區應該用于 1/4/1920 之前的所有日期,但似乎實作使用的 -402 偏移量僅從 1/1/1900 0:00:00.000 UTC(從 1/1/1900 6 :42:04.000 在您的時區)直到 1/4/1920 在您的時區,否則 -420。我不確定,這是故意的還是錯誤。
如何忽略同一時區的不同時間偏移。
如果您實際上在應用程式中使用時區,則不應忽略它們。但是,如果您制作的應用程式旨在僅在您的本地時區中使用,那么您可以使用沒有時區資訊的 DateTime 類,例如java.time.LocalDateTime. 同樣值得注意的是:即使這些時區是正確的,歷史日期可能仍然不準確,因為現代時間規則適用于所有時間(見下文)。所以最終這取決于你的用例是什么。
ISO-8601 日歷系統中沒有時區的日期時間。ISO-8601 日歷系統是當今世界大部分地區使用的現代民用日歷系統。它相當于預兆公歷系統,其中今天的閏年規則適用于所有時間。對于當今撰寫的大多數應用程式,ISO-8601 規則完全適用。但是,任何使用歷史日期并要求它們準確的應用程式都會發現 ISO-8601 方法不合適。
uj5u.com熱心網友回復:
java.util.Date 和 java.text.SimpleDateFormat 是非常古老的類。盡管它們大多有效,但很難正確使用,尤其是在涉及時區的情況下。
Date.getTimezoneOffset 已棄用。 不要使用不推薦使用的方法。
使用時區規則的正確方法是使用java.time、java.time.zone和java.time.format包:
ZoneId zone = ZoneId.systemDefault();
DateTimeFormatter dateFormatter =
DateTimeFormatter.ofPattern("MM/dd/yyyy H:mm:ss.SSS");
LocalDateTime date =
LocalDateTime.parse("01/01/1900 7:00:00.000", dateFormatter);
System.out.println(date);
System.out.println(zone.getRules().getOffset(date));
LocalDateTime date2 =
LocalDateTime.parse("01/01/1900 6:00:00.000", dateFormatter);
System.out.println(date2);
System.out.println(zone.getRules().getOffset(date2));
時區的整個歷史記錄在ZoneRules 中:
System.out.println();
zone.getRules().getTransitions().forEach(System.out::println);
System.out.println();
zone.getRules().getTransitionRules().forEach(System.out::println);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/396994.html
上一篇:我應該如何在我的應用程式的Flutter移動版和網路版之間做出一些區別?
下一篇:更新屬性系結
