1. Иван Сагалаев

    02.01.2010

    1 ↑
    0 ↓

    Вдруг заинтересовался, поддерживает ли Питон високосные секунды. Оказывается, нет:

    >>> from datetime import datetime, timedelta
    >>> datetime(2008, 12, 31, 23, 59, 59) + timedelta(seconds=1)
    datetime.datetime(2009, 1, 1, 0, 0)
    

    ... а должно быть 2008-12-31 23:59:60.

    Кто-нибудь как-нибудь обходил эту проблему? Никакой практической задачи у меня нет, просто интересно.

  2. dmage

    02.01.2010

    3 ↑
    0 ↓

    Действительно интересно :)

    Как написано в документации к пакету Gentoo sys-libs/timezone-data: POSIX requires that systems ignore leap seconds, что сразу огорчает. Однако в Gentoo есть возможность включить високосные секунды указав зону right/Europe/Moscow:

    $ TZ=right/Europe/Moscow python
    Python 2.6.4 (r264:75706, Dec  8 2009, 19:55:33)
    [GCC 4.3.4] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>> from datetime import datetime, timedelta
    >>> from time import ctime
    >>> make_timestamp = lambda x: int(x.strftime('%s'))
    >>> x = datetime(2006, 1, 1, 2, 59, 59)
    >>> x + timedelta(seconds=1)
    datetime.datetime(2006, 1, 1, 3, 0)
    >>> datetime.fromtimestamp(make_timestamp(x))
    datetime.datetime(2006, 1, 1, 2, 59, 59)
    >>> datetime.fromtimestamp(make_timestamp(x)+1)
    datetime.datetime(2006, 1, 1, 2, 59, 59)
    >>> datetime.fromtimestamp(make_timestamp(x)+2)
    datetime.datetime(2006, 1, 1, 3, 0)
    >>> ctime(make_timestamp(x) + 1)
    'Sun Jan  1 02:59:60 2006'
    

    Смотря на ограничение 0 <= second < 60 в документации datetime возникает сомнение, что datetime умеет високосные секунды.

  3. Иван Сагалаев

    02.01.2010

    0 ↑
    0 ↓

    Спасибо за исследование, про ctime я не знал.

    А datetime действительно не умеет leap seconds, там в доке про это явно написано.

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.