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(weeks=1)>>> 過去 = pendulum.now().subtract( minutes=2)>>> past.diff_for_humans()'2 minutes ago'>>> delta = past - last_week>>> delta.hours23>>> delta.in_words(locale='en')'6 days 23 hours 58 minutes'# 日時の適切な処理正規化>>> ペンデュラム.datetime(2013, 3, 31, 2, 30, tz='ヨーロッパ/パリ')'2013-03-31T03:30:00+02:00' # 2:30 は存在しません (時間スキップ)# 夏時間移行の適切な処理>>> just_before = pendulum.datetime(2013) 、3、31、1、59、59、999999、 tz='ヨーロッパ/パリ')'2013-03-31T01:59:59.999999+01:00'>>> just_before.add(マイクロ秒=1)'2013-03-31T03:00:00+02:00'
公式ウェブサイト
ドキュメント
問題追跡ツール
基本的なケースにはネイティブのdatetime
インスタンスで十分ですが、より複雑なユースケースに直面すると、多くの場合制限が表示され、直感的に操作することができません。 Pendulum
標準ライブラリに依存しながら、よりクリーンで使いやすい API を提供します。つまり、まだdatetime
ですが、改善されました。
Python の他の datetime ライブラリとは異なり、Pendulum は標準のdatetime
クラスをドロップインで置き換えるものです (クラスから継承されています)。そのため、基本的には、コード内ですべてのdatetime
インスタンスをDateTime
インスタンスに置き換えることができます (例外は、たとえば、 sqlite3
やPyMySQL
などのtype
関数を使用してオブジェクトの型を決定します)。
また、単純な日時の概念も削除されます。各Pendulum
インスタンスはタイムゾーンを認識し、使いやすいようにデフォルトでUTC
になります。
Pendulum は、より直観的なメソッドとプロパティを提供することで、標準のtimedelta
クラスも改善します。
DateTime
クラスはdatetime
のサブクラスであっても、まれにネイティブ クラスを直接置き換えることができない場合があります。以下は、報告されたケースのリスト (すべてではありません) と、考えられる解決策 (ある場合) です。
sqlite3
デフォルトでtype()
関数を使用してオブジェクトのタイプを決定します。これを回避するには、新しいアダプターを登録します。
振り子から import DateTimefrom sqlite3 import register_adapterregister_adapter(DateTime, lambda val: val.isoformat(' '))
mysqlclient
(旧MySQLdb
) とPyMySQL
、デフォルトでtype()
関数を使用してオブジェクトのタイプを決定します。これを回避するには、新しいアダプターを登録します。
import MySQLdb.converterssimport pymysql.convertersfrom 振り子 import DateTimeMySQLdb.converters.conversions[DateTime] = MySQLdb.converters.DateTime2literalpymysql.converters.conversions[DateTime] = pymysql.converters.escape_datetime
django
isoformat()
メソッドを使用して日時をデータベースに保存します。ただし、 pendulum
常にタイムゾーンを認識するため、少なくとも MySQL データベースの場合、 isoformat()
によってオフセット情報が常に返され、エラーが発生します。これを回避するには、独自のDateTimeField
を作成するか、 MySQLdb
の以前の回避策を使用します。
from django.db.models import DateTimeField as BaseDateTimeFieldfrompendulum 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 ' ' val が None の場合、それ以外の場合 val.isoformat()
特にローカライズに関する貢献は歓迎されます。
Pendulum コードベースで作業するには、プロジェクトをローカルに複製し、詩を介して必要な依存関係をインストールする必要があります。
$ git clone [email protected]:sdispater/pendulum.git $詩のインストール
ローカリゼーションを支援したい場合は、ロケールがすでに存在するか存在しないという 2 つの異なるケースがあります。
ロケールが存在しない場合は、 clock
ユーティリティを使用してロケールを作成する必要があります。
./ Clock locale create <あなたのロケール>
ロケールにちなんで名付けられたディレクトリが、 pendulum/locales
に次の構造で生成されます。
<あなたのロケール>/
- カスタム.py
- locale.py
locale.py
ファイルは変更しないでください。これには、CLDR データベースによって提供される翻訳が含まれています。
変更するのは、 custom.py
ファイルです。これには、CLDR データベースによって提供されない、Pendulum に必要なデータが含まれています。 en データを参照として使用して、どのデータが必要であるかを確認できます。
作成または変更したロケールのテストも追加する必要があります。