Import

如何從 xml 文件中提取 cldr 時區以儲存在數據庫表中?

  • April 1, 2020

在我們的數據庫中,我需要將每個位置與“時區”相關聯。

這些時區位於https://github.com/unicode-org/cldr/blob/release-36-1/common/supplemental/metaZones.xml

我想在那個 xml 文件中創建一個時區名稱字元串表,這樣我們就有一個“時區表 ID”,我可以將它作為位置數據的一部分發送到客戶端軟體。客戶端包含使用時區來確定該位置給定日期時間的時間偏移量(例如 UTC+1)的程式碼。

也就是說,為了某些(內部)目的,我們將使用此表 ID,而不是儲存/發送/解析時區字元串。


如何從該 xml 文件中提取時區名稱字元串列表,並將其儲存在數據庫表中?(顯然我可以編寫一個小程序來做到這一點,但肯定有人已經這樣做了。)

或者也許在每個版本的其他地方cldr,有這些時區的(明文)列表?

或者CSV格式化的資訊,手動按摩會更容易。

部分答案:如何將相關資訊轉換為csv.

編輯文件以刪除除此部分之外的所有內容:

<metazoneInfo>
   <timezone type="Africa/Abidjan">
       <usesMetazone mzone="GMT"/>
   </timezone>
...
   <timezone type="PST8PDT">
       <usesMetazone mzone="America_Pacific"/>
   </timezone>
</metazoneInfo>

使用 XML 到 CSV 轉換器。(我使用了 https://www.convertcsv.com/xml-to-csv.htm

結果:

usesMetazone/0/_mzone,_type,usesMetazone/0/_to, ...
GMT,Africa/Abidjan,,,,,,,,,,,,,,,,,,,,,,,,,
GMT,Africa/Accra,,,,,,,,,,,,,,,,,,,,,,,,,
...
Wallis,Pacific/Wallis,,,,,,,,,,,,,,,,,,,,,,,,,
America_Pacific,PST8PDT,,,,,,,,,,,,,,,,,,,,,,,,,

第一行描述提取的 XML 屬性。其餘行以“metazone,timezone”開頭。

附加列描述了歷史變化;例如“從日期到日期,元區域”。也就是說,某些時區在指定的日期範圍內使用不同的元區域。

在解釋具有此類歷史數據的任何時區時必須小心。第一列中的元區可能不是目前時區;這在 XML 中更容易看到,其中“metazone 0”是提到的第一個 metazone,因此可能是最早的一個(它有一個“to”日期但沒有“from”日期)。


在那種情況下,我認為 CURRENT 元區域總是最後提到的(最右邊的列,有一個.../_mzone標題)。

例如,時區“非洲/阿爾及爾”:

XML:

<timezone type="Africa/Algiers">
   <usesMetazone to="1977-10-20 23:00" mzone="Europe_Western"/>
   <usesMetazone to="1979-10-25 23:00" from="1977-10-20 23:00" mzone="Europe_Central"/>
   <usesMetazone to="1981-05-01 00:00" from="1979-10-25 23:00" mzone="Europe_Western"/>
   <usesMetazone from="1981-05-01 00:00" mzone="Europe_Central"/>
</timezone>

CSV:

Europe_Western,Africa/Algiers,1977-10-20 23:00,1979-10-25 23:00,1977-10-20 23:00,Europe_Central,1981-05-01 00:00,1979-10-25 23:00,Europe_Western,1981-05-01 00:00,Europe_Central,,,,,,,,,,,,,,,,

在電子表格中,我們看到最右邊的兩列是:

usesMetazone/3/_from   usesMetazone/3/_mzone
1981-05-01 00:00       Europe_Central

所以目前的元區域是Europe_Central,而不是Europe_Western來自第一列。


除了獲得正確的“目前”元區域的問題外,前兩列可以輕鬆導入 DB:stackoverflow thead

引用自:https://dba.stackexchange.com/questions/264083