Search code examples
timezonetimezone-offsetpytz

Why isn't the offset of Samoa +13 or +14 when using pytz?


I've just read

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

I wanted to see this with pytz, but everything I tried only showed an offset of -11, but not of +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'

Why can't I see the offset +13 / +14?


Solution

  • Both Pacific/Samoa and US/Samoa are aliases of Pacific/Pago_Pago, representing American Samoa, which is UTC-11 and did not skip that day.

    • For American Samoa, use Pacific/Pago_Pago

    • For the Independent State of Samoa, use Pacific/Apia

    • For Tokelau, use Pacific/Fakaofo

    Personally, I prefer to only use canonical zone names. See the list on Wikipedia for reference.

    See the timezone change with pytz

    UTC time with offset:

    >>> 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'
    

    Local time:

    >>> '{:%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'