Даты и времена Python стали проще.
Поддерживает Python 3.8 и новее .
>>> import pendulum >>> now_in_paris = pendulum.now('Europe/Paris') >>> now_in_paris'2016-07-04T00:49:58.502116+02:00'# Плавное переключение часовых поясов>>> now_in_paris.in_timezone('UTC')'2016-07-03T22:49:58.502116+00:00'>>> завтра = pendulum.now().add(days=1)>>> Last_week = pendulum.now() .subtract(недели=1)>>> прошлое = маятник.сейчас().вычитание(минуты=2)>>> Past.diff_for_humans()'2 минуты назад'>>> delta = Past - Last_week>>> delta.hours23 >>> delta.in_words(locale='en')'6 дней 23 часа 58 минут'# Правильная обработка даты и времени нормализация>>> pendulum.datetime(2013, 3, 31, 2, 30, tz='Europe/Paris')'2013-03-31T03:30:00+02:00' # 2:30 не существует (пропущенное время)# Правильная обработка переходов dst >>> just_before = pendulum.datetime(2013 , 3, 31, 1, 59, 59, 999999, tz='Европа/Париж')'2013-03-31T01:59:59.999999+01:00'>>> just_before.add(microсекунды=1)'2013-03-31T03:00:00+02:00'
Официальный сайт
Документация
Трекер проблем
Нативных экземпляров datetime
достаточно для базовых случаев, но когда вы сталкиваетесь с более сложными вариантами использования, они часто имеют ограничения и с ними не так интуитивно понятно работать. Pendulum
предоставляет более чистый и простой в использовании API, при этом полагаясь на стандартную библиотеку. Так что это все еще datetime
, но уже лучше.
В отличие от других библиотек datetime для Python, Pendulum представляет собой замену стандартного класса datetime
(он наследуется от него), поэтому, по сути, вы можете заменить все ваши экземпляры datetime
экземплярами DateTime
в своем коде (существуют исключения для библиотек, которые проверяют тип объектов с помощью функции type
, например, sqlite3
или PyMySQL
).
Это также устраняет понятие наивных дат и времени: каждый экземпляр Pendulum
учитывает часовой пояс и по умолчанию использует UTC
для простоты использования.
Pendulum также улучшает стандартный класс timedelta
, предоставляя более интуитивно понятные методы и свойства.
Несмотря на то, что класс DateTime
является подклассом datetime
в некоторых редких случаях он не может напрямую заменить собственный класс. Вот список (неполный) зарегистрированных случаев с возможным решением, если таковое имеется:
sqlite3
будет использовать функцию type()
для определения типа объекта по умолчанию. Чтобы обойти эту проблему, вы можете зарегистрировать новый адаптер:
из маятникового импорта DateTimeиз sqlite3 import Register_adapterregister_adapter(DateTime, лямбда-значение: val.isoformat(' '))
mysqlclient
(ранее MySQLdb
) и PyMySQL
будут использовать функцию type()
для определения типа объекта по умолчанию. Чтобы обойти эту проблему, вы можете зарегистрировать новый адаптер:
import MySQLdb.convertersimport pymysql.convertersfrom маятник import DateTimeMySQLdb.converters.conversions[DateTime] = MySQLdb.converters.DateTime2literalpymysql.converters.conversions[DateTime] = pymysql.converters.escape_datetime
django
будет использовать метод isoformat()
для хранения даты и времени в базе данных. Однако, поскольку pendulum
всегда учитывает часовой пояс, информация о смещении всегда будет возвращаться функцией isoformat()
вызывая ошибку, по крайней мере, для баз данных MySQL. Чтобы обойти эту проблему, вы можете создать свой собственный DateTimeField
или использовать предыдущий обходной путь для MySQLdb
:
из django.db.models import DateTimeField as BaseDateTimeFieldfrom маятник import DateTimeclass DateTimeField(BaseDateTimeField):def value_to_string(self, obj):val = self.value_from_object(obj)if isinstance(value, DateTime):return value.to_datetime_string()return ' ' если значение равно None else val.isoformat()
Вклады приветствуются, особенно в области локализации.
Чтобы работать с кодовой базой Pendulum, вам потребуется клонировать проект локально и установить необходимые зависимости через поэтику.
$ git clone [email protected]:sdispater/pendulum.git $ установка поэзии
Если вы хотите помочь с локализацией, есть два разных случая: локаль уже существует или нет.
Если локаль не существует, вам необходимо создать ее с помощью утилиты clock
:
./lockalale create <ваш-локаль>
Он создаст каталог в pendulum/locales
названный в честь вашей локали, со следующей структурой:
<ваш-локаль>/
- custom.py
- locale.py
Файл locale.py
нельзя изменять. Он содержит переводы, предоставленные базой данных CLDR.
Файл custom.py
— это тот файл, который вы хотите изменить. Он содержит данные, необходимые Pendulum, но не предоставленные базой данных CLDR. Вы можете использовать данные en в качестве ссылки, чтобы увидеть, какие данные необходимы.
Вам также следует добавить тесты для созданной или измененной локали.