1. Google Mainline Timezone
Mainline 模块 com.google.android.tzdata3 使用了 ICU 的数据和接口:
http://aospxref.com/android-12.0.0_r3/xref/external/icu/
http://aospxref.com/android-12.0.0_r3/xref/system/timezone/
https://aospxref.com/android-12.0.0_r3/xref/cts/common/device-side/util-axt/src/com/android/compatibility/common/util/mainline/MainlineModule.java
2. ICU 模块以及 IANA 数据
ICU 的数据来自 IANA:
ICU - International Components for Unicode
https://github.com/unicode-org/icu
https://www.iana.org/time-zones
以美国为例,可看到 2007 年开始,夏令时开始和结束时间已基本没有变化了:
\tzdata2022f.tar.gz\tzdata2022f.tar\northamerica
# Rule NAME FROM TO - IN ON AT SAVE LETTER/S
Rule US 1918 1919 - Mar lastSun 2:00 1:00 D
Rule US 1918 1919 - Oct lastSun 2:00 0 S
Rule US 1942 only - Feb 9 2:00 1:00 W # War
Rule US 1945 only - Aug 14 23:00u 1:00 P # Peace
Rule US 1945 only - Sep 30 2:00 0 S
Rule US 1967 2006 - Oct lastSun 2:00 0 S
Rule US 1967 1973 - Apr lastSun 2:00 1:00 D
Rule US 1974 only - Jan 6 2:00 1:00 D
Rule US 1975 only - Feb lastSun 2:00 1:00 D
Rule US 1976 1986 - Apr lastSun 2:00 1:00 D
Rule US 1987 2006 - Apr Sun>=1 2:00 1:00 D
Rule US 2007 max - Mar Sun>=8 2:00 1:00 D
Rule US 2007 max - Nov Sun>=1 2:00 0 S
在历史上,不同的地区也可能会存在与国家不同的夏令时,这也会在各个地区上进行标记,确保时间的可回溯性。
3. 结论
IANA tzdata中包含了各个国家的夏令时开始时间,结束时间信息,但是没有找到利用该时间信息的 API。
当然,也可以通过脚本导出该夏令时开始和结束时间的合适格式,给各种场景使用。
4. 参考资料
zoneinfo — IANA time zone support
https://docs.python.org/3/library/zoneinfo.html
tzdata
https://github.com/python/tzdata
https://pypi.org/project/tzdata/
https://tzdata.readthedocs.io/en/latest/index.html
timeanddate
https://www.timeanddate.com/
https://www.timeanddate.com/time/dst/2022.html
Android中的Unicode国际组件(ICU)库
https://www.jianshu.com/p/920acad5ec53
国际化组件 Unicode (ICU) 函数库
https://cloud.tencent.com/developer/article/1694599