Полнофункциональная библиотека даты и времени - PullRequest
7 голосов
/ 18 сентября 2009

Мне интересно, знает ли кто-нибудь хорошую библиотеку даты и времени, которая имеет правильно реализованные функции, такие как:

  • Микросекундное разрешение
  • Летнее время
    • Пример: он знает, что 2:30 утра в США не существовало 8 марта 2009 года для часовых поясов, которые учитывают переход на летнее время.
    • Я должен быть в состоянии указать часовой пояс, такой как "США / Восточный", и он должен быть достаточно умным, чтобы знать, должна ли данная временная метка соответствовать EST или EDT.
  • Пользовательские диапазоны дат
    • Возможность создавать специализированные бизнес-календари, которые пропускаются в выходные и праздничные дни.
  • Пользовательские диапазоны времени
    • Возможность определения рабочих часов, чтобы время, запрошенное вне рабочих часов, можно было округлять в большую или меньшую сторону до следующего или предыдущего действительного часа.
  • арифметика
    • Уметь складывать и вычитать целые числа всех единиц (годы, месяцы, недели, дни, часы, минуты, ...). Обратите внимание, что добавление примерно 0,5 дня не является четко определенным, поскольку это может означать 12 часов или половину продолжительности дня (что не равно 24 часам при переходе на летнее время).
  • естественное выравнивание границ
    • Учитывая временную метку, я хотел бы иметь возможность делать такие вещи, как округление до ближайшего десятилетия, года, месяца, недели, ..., четверть часа, часа и т. Д.

В настоящее время я использую Python, хотя я счастлив иметь решение на другом языке, таком как perl, C или C ++.

Я обнаружил, что встроенным библиотекам Python не хватает изощренности с их логикой перехода на летнее время, и нет очевидного (для меня) способа настроить такие вещи, как настраиваемые диапазоны времени.

Ответы [ 6 ]

11 голосов
/ 18 сентября 2009

Модуль datetime стандартной библиотеки Python намеренно ограничен не противоречивыми аспектами, которые не изменяются все время законодательным актом - поэтому он намеренно исключает прямую поддержку часовых поясов, DST, нечеткого разбора и плохо определенной арифметики. (например, «через месяц» ...) и тому подобное. Вдобавок ко всему, dateutil для многих видов манипуляций и pytz для часовых поясов (включая проблемы летнего времени), добавляют большую часть того, что вы просите, хотя и не крайне взрывоопасные вещи, такие как «праздники», которые так сильно различаются не только между политическими юрисдикциями, но даже между работодателями в пределах юрисдикции юрисдикции (например, в США некоторые работодатели считают «День Колумба» праздником, но многие этого не делают - а некоторые с офисами во многих местах проводить время в некоторых местах, но не в других, учитывая тотальный хаос, ожидать, что найти универсальную библиотеку, которая каким-то волшебным образом придаст смысл хаосу, довольно странно).

6 голосов
/ 04 июня 2013

Видел это на днях, я сам этим не пользовался ... выглядит многообещающе. http://crsmithdev.com/arrow/

6 голосов
/ 18 сентября 2009

Посмотрите на dateutil и, возможно, mx.DateTime пакетов.

4 голосов
/ 18 сентября 2009

Я должен быть в состоянии указать часовой пояс как "США / Восток", и это должно быть достаточно умен, чтобы знать, является ли данное временная метка должна соответствовать EST или EDT.

Эта часть не всегда возможна - так же, как 2:30 утра не существует в течение одного дня года (в часовых поясах с переходом на летнее время, которое переключается в 2:00 утра), 2:30 утра существует дважды на другой день - один раз в EDT, а затем через час в EST. Если вы передадите эту дату / время в библиотеку, как она узнает, о каком из двух раз вы говорите?

2 голосов
/ 18 сентября 2009

Хотя книге уже более десяти лет, я настоятельно рекомендую прочитать Стандартную библиотеку даты / времени C: программирование мировых календарей и часов от Ланса Латама. Это одна из тех книг, которую вы время от времени будете подбирать в изумлении, что она вообще была написана. Автор более подробно, чем вы хотите, расскажет о календарях и системах учета времени, а также разрабатывает исходный код для библиотеки (написанной на C) для обработки всех вычислений.

Удивительно, но, кажется, все еще в печати ...

1 голос
/ 08 февраля 2014

Я только что выпустил библиотеку Python под названием Fleming (https://github.com/ambitioninc/fleming),), и она, похоже, решает две ваши проблемы с изощренностью в отношении перехода на летнее время.

Проблема 1. Арифметика. У Флеминга есть функция add_timedelta, которая берет timedelta (из модуля datetime Python) или относительную delta из python-dateutil и добавляет его к объекту datetime. Функция add_timedelta обрабатывает случай, когда объект datetime пересекает границу DST. Проверьте https://github.com/ambitioninc/fleming#add_timedelta для полного объяснения и примеров. Вот краткий пример:

import fleming
import datetime
import timedelta

dt = fleming.add_timedelta(dt, datetime.timedelta(weeks=2, days=1))
print dt
2013-03-29 20:00:00-04:00
# Do timedelta arithmetic such that it starts in DST and crosses over into no DST.
# Note that the hours stay in tact and the timezone changes
dt = fleming.add_timedelta(dt, datetime.timedelta(weeks=-4))
print dt
2013-03-01 20:00:00-05:00

Проблема 2. Естественное выравнивание границ. У Флеминга есть функция пола, которая может принимать произвольное выравнивание. Допустим, ваше время было datetime (2013, 2, 3) и вы указали минимальный интервал месяца = 3. Это означает, что он будет округляться до ближайшего триместра (квартала). Вы также можете указать ближайшее десятилетие, используя год = 10 в аргументах. Проверьте (https://github.com/ambitioninc/fleming#floordt-within_tznone-yearnone-monthnone-weeknone-daynone-hournone-minutenone-secondnone-microsecondnone) для полных примеров и иллюстраций. Вот быстрый:

import fleming
import datetime

# Get the starting of a quarter by using month=3
print fleming.floor(datetime.datetime(2013, 2, 4), month=3)
2013-01-01 00:00:00
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...