亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

神奇的 00:09 時區與 DatatypeFactory

神奇的 00:09 時區與 DatatypeFactory

MMTTMM 2021-09-26 16:55:37
在 java 中,有一個javax.xml.datatype.DatatypeFactory可用于導入和導出 xml 日期,如下所示。  String xmlDateIn = "1900-01-01T12:00:00";  DatatypeFactory df = DatatypeFactory.newInstance();  XMLGregorianCalendar xmlCalendar = df.newXMLGregorianCalendar(xmlDateIn);  String xmlDateOut = xmlCalendar.toXMLFormat();在這個簡單的情況下xmlDateIn等于xmlDateOut,正如預期的那樣。但如果我想要它,java.lang.Date事情就會變得有趣。  GregorianCalendar gregorianCalendar = xmlCalendar.toGregorianCalendar();  Date dts = gregorianCalendar.getTime();  System.out.println(dts);  // prints Mon Jan 01 12:00:00 CET 1900乍一看它仍然可以正常工作,但實際上內部某些東西似乎已損壞。使用我的 IDE,我可以看到Date對象內部發生了什么。(如果你想知道,我住在 CET 時區。)看看這個奇怪的時區。當我嘗試將其轉換回 XML 時,實際上也打印了 9 分鐘時區。所以,這不僅僅是內部的事情。  DatatypeFactory df2 = DatatypeFactory.newInstance();  GregorianCalendar gc2 = new GregorianCalendar();  gc2.setTime(dts);  XMLGregorianCalendar xc2 = df2.newXMLGregorianCalendar(gc2);  System.out.println(xc2.toXMLFormat()); // prints 1900-01-01T12:00:00.000+00:09 為了修復它,如果我手動設置時區,事情會變得非常糟糕。看看這個神奇的時刻:  String xmlDateIn = "1900-01-01T12:00:00";  DatatypeFactory df = DatatypeFactory.newInstance();  XMLGregorianCalendar xmlCalendar = df.newXMLGregorianCalendar(xmlDateIn);  xmlCalendar.setTimezone(0);  // <--- ONLY CHANGE  GregorianCalendar gregorianCalendar = xmlCalendar.toGregorianCalendar();  Date dts = gregorianCalendar.getTime();實際上我對我的特定程序有一個解決方法:現在對我有用的是我在導入 xml 時沒有設置時區。在Date隨后進行了錯誤的時區內部,即9分鐘。然后,當我最終想將其導出Date回 xml 時,我確實將 xml gregorian 日歷上的時區設置為 0,這神奇地修復了它并再次導出正確的 xml 格式。但實際上,我想知道這種瘋狂的行為是否有任何好的解釋。
查看完整描述

2 回答

?
慕碼人2483693

TA貢獻1860條經驗 獲得超9個贊

我對日歷歷史和官方計時不太了解,所以我首先確保我使用的是您的時區來測試它:


int offset = (int) TimeUnit.HOURS.toMillis(1);

String[] ids = TimeZone.getAvailableIDs(offset);

TimeZone cet = Arrays.stream(ids).map(TimeZone::getTimeZone)

    .filter(tz -> tz.getDisplayName(false, TimeZone.SHORT).equals("CET"))

    .findFirst().orElseThrow(

        () -> new RuntimeException("No CET timezone found"));


TimeZone.setDefault(cet);

然后我檢查了那個時區的一些內部運作。特別是,我打印了它的歷史時間轉換:


System.out.println("Transitions:");

cet.toZoneId().getRules().getTransitions().forEach(

    t -> System.out.println("  " + t));

前兩個這樣的轉換打印為:


Transition[Overlap at 1891-03-15T00:01+00:12:12 to +00:09:21]

Transition[Overlap at 1911-03-11T00:00+00:09:21 to Z]

隨后是祖魯語 (Z) 和 UTC+01:00 之間的各種“手動”轉換。


因此,1900 年的午夜實際上比 1912 年相應日期的午夜晚了 9 分 21 秒。


實際上,如果將年份更改為 1912,則不會看到 9 分鐘的差異:


String xmlDateIn = "1912-01-01T12:00:00";

我一直無法找到 12:12 或 9:21 轉換的歷史原因。我認為這只是一個科學追趕的問題,因為天文測量變得更加準確。


查看完整回答
反對 回復 2021-09-26
  • 2 回答
  • 0 關注
  • 276 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號