为啥使用pytz时萨摩亚的偏移量不是+13或+14?

Posted

技术标签:

【中文标题】为啥使用pytz时萨摩亚的偏移量不是+13或+14?【英文标题】:Why isn't the offset of Samoa +13 or +14 when using pytz?为什么使用pytz时萨摩亚的偏移量不是+13或+14? 【发布时间】:2019-02-04 15:42:45 【问题描述】:

我刚刚读过

BBC:Samoa and Tokelau skip a day for dateline change,2011 年 12 月 30 日

我想用pytz 看到这个,但我尝试的所有东西都只显示偏移量-11,而不是+13 or +14:

>>> import pytz
>>> tz = pytz.timezone('Pacific/Samoa')
>>> tz_us = pytz.timezone('US/Samoa')
>>> import datetime
>>> datetime.datetime(2011, 12, 30, 9, 00, tzinfo=datetime.timezone.utc).astimezone(tz).isoformat()
'2011-12-29T22:00:00-11:00'
>>> datetime.datetime(2011, 12, 30, 10,00, tzinfo=datetime.timezone.utc).astimezone(tz).isoformat()
'2011-12-29T23:00:00-11:00'
>>> datetime.datetime(2011, 12, 30, 11, 00, tzinfo=datetime.timezone.utc).astimezone(tz).isoformat()
'2011-12-30T00:00:00-11:00'
>>> datetime.datetime(2011, 12, 31, 15, 00, tzinfo=datetime.timezone.utc).astimezone(tz).isoformat()
'2011-12-31T04:00:00-11:00'
>>> datetime.datetime(2015, 12, 31, 15, 00, tzinfo=datetime.timezone.utc).astimezone(tz).isoformat()
'2015-12-31T04:00:00-11:00'
>>> datetime.datetime(2011, 12, 31, 15, 00, tzinfo=datetime.timezone.utc).astimezone(tz_us).isoformat()
'2011-12-31T04:00:00-11:00'
>>> datetime.datetime(2015, 12, 31, 15, 00, tzinfo=datetime.timezone.utc).astimezone(tz_us).isoformat()
'2015-12-31T04:00:00-11:00'

为什么我看不到偏移量 +13 / +14?

【问题讨论】:

如果我从字面上理解你的问题,答案是地缘政治和区域经济之一。如果这不是您的问题,请编辑您的问题以反映您的预期问题。还可以考虑标记您正在使用的相关语言/框架。 如果我理解***+文章正确,“地缘政治和区域经济学”的答案将是错误的。他们确实有 +13 或 +14(都是由于 DST),但不是 -11。 【参考方案1】:

Pacific/SamoaUS/Samoa 都是Pacific/Pago_Pago 的别名,代表美属萨摩亚,即UTC-11,并没有跳过那一天。

对于美属萨摩亚,请使用Pacific/Pago_Pago

对于萨摩亚独立国,请使用Pacific/Apia

对于托克劳,请使用Pacific/Fakaofo

就我个人而言,我更喜欢只使用规范的区域名称。参考the list on Wikipedia。

用pytz查看时区变化

带有偏移的UTC时间:

>>> import pytz
>>> tz = pytz.timezone('Pacific/Apia')
>>> import datetime
>>> datetime.datetime(2011, 12, 30, 9, 59, tzinfo=datetime.timezone.utc).astimezone(tz).isoformat()
'2011-12-29T23:59:00-10:00'
>>> datetime.datetime(2011, 12, 30, 10, 00, tzinfo=datetime.timezone.utc).astimezone(tz).isoformat()
'2011-12-31T00:00:00+14:00'

当地时间:

>>> ':%Y-%m-%d %H:%M'.format(datetime.datetime(2011, 12, 30, 9, 59, tzinfo=datetime.timezone.utc).astimezone(tz))
'2011-12-29 23:59'
>>> ':%Y-%m-%d %H:%M'.format(datetime.datetime(2011, 12, 30, 10, 00, tzinfo=datetime.timezone.utc).astimezone(tz))
'2011-12-31 00:00'

【讨论】:

不错!我可以添加显示我想看到的代码吗? 您是如何查询时区的?我使用this answer 并搜索“萨摩亚”,但这样我永远找不到Pacific/Apia gist.github.com/MartinThoma/2c59338684dfdd63e75dae69d76b9130 是我要添加的内容。 当然,如果有建设性,请随时进行编辑。至于如何找到它们,有助于了解该地区的地理位置。此外,***上的列表有两个字符的国家代码,所以这是一个很好的交叉参考。此外,timeanddate.com 具有扩展的城市查找功能,您通常可以从那里找出正确的 IANA 区域 ID。如果您想从纬度/经度坐标以编程方式执行此操作,请参阅***.com/questions/16086962/…

以上是关于为啥使用pytz时萨摩亚的偏移量不是+13或+14?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 pytz 在跨越 TZ 和 DST 边界而不是 TZ 名称时正确调整时间和偏移量?

为啥萨摩亚的 pytz 和 dateutil 得到不同的结果?

pytz 时区的 STD 偏移量

Python & pytz:确定时区是不是支持 DST 以及 DST 和非 DST UTC 偏移量是多少

Python pytz 时区转换返回的值与不同日期的时区偏移量不同

如何在 python 和 django 中使用 Pytz 根据给定的 UTC 偏移量转换数据和时间?