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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用pytz时,为什么不是萨摩亚+13或+14的偏移量?相关的知识,希望对你有一定的参考价值。

我刚读过

BBC:Samoa and Tokelau skip a day for dateline change,30.12.2011

我想用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?

答案

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'

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

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

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

使用 pytz 时区时 Python 日期时间不包括 DST

何时使用 datetime.utcnow() 或 datetime.now(tz=pytz.utc).replace(tzinfo=None)

Python pytz:不存在的时间得到 AmbiguousTimeError,而不是 NonExistentTimeError

当 pytz.timezone() 传递给 tzinfo 时,pytz 返回 LMT 时区而不是 GMT