python datetimeモジュールを詳しく説明します。

6600 ワード

datetimeはPython処理日時の標準ライブラリです。
現在の日付と時刻を取得
まず、現在の日付と時間をどうやって取得するかを見ます。

>>> from datetime import datetime
>>> now = datetime.now() #     datetime
>>> print(now)
2015-05-18 16:28:07.198690
>>> print(type(now))
<class 'datetime.datetime'>
datetimeはモジュールであり、datetimeはまたdatetimeクラスを含んでいます。from datetime import datetimeを通じて導入されたのがdatetimeクラスです。import datetimeだけ導入されるなら、フルネームdatetime.datetimeを参照してください。datetime.now()は現在の日付と時間を返します。そのタイプはdatetimeです。
指定された日時の取得
日付と時間を指定するには、直接パラメータでdatetimeを作成します。

>>> from datetime import datetime
>>> dt = datetime(2015, 4, 19, 12, 20) #          datetime
>>> print(dt)
2015-04-19 12:20:00
datetimeをtimestampに変換します。
コンピュータでは、時間は実際には数字で表されています。私たちは1970年1月1日00:00 UTC+00:00タイムゾーンの時刻を「epoch time」と呼び、0(1970年以前の時間timestampはマイナス)と表記します。現在の時間はepoch timeに対する秒数です。timestampといいます。
考えられます

timestamp = 0 = 1970-1-1 00:00:00 UTC+0:00
対応する北京時間は:

timestamp = 0 = 1970-1-1 08:00:00 UTC+8:00
timestampの値はタイムゾーンとは無関係であることが分かります。timestampが確定すると、そのUTC時間が確定し、任意のタイムゾーンに変換する時間も完全に確定されます。これはなぜコンピュータに記憶されている現在の時間はtimestampで表されていますか?全世界の計算機はどの時刻でもtimestampが完全に同じです。datetimeタイプをtimestampに変換するには、簡単にtimestamp()メソッドを呼び出す必要があります。

>>> from datetime import datetime
>>> dt = datetime(2015, 4, 19, 12, 20) #          datetime
>>> dt.timestamp() #  datetime   timestamp
1429417200.0
注意Pythonのtimestampは浮動小数点です。小数位がある場合、小数位はミリ秒数を表します。
いくつかのプログラミング言語(JavaやJavaScriptなど)のtimestampは整数を使ってミリ秒数を表しています。この場合、timestampを1000で割るだけでPythonの浮動小数点表示方法が得られます。
timestampをdatetimeに変換します。
timestampをdatetimeに変換し、datetimeで提供されるfromtimestamp()の方法を使用します。

>>> from datetime import datetime
>>> t = 1429417200.0
>>> print(datetime.fromtimestamp(t))
2015-04-19 12:20:00
timestampは浮動小数点であることに気づきました。タイムゾーンの概念がなく、datetimeにはタイムゾーンがあります。上記の変換は、timestampとローカル時間で変換されます。
ローカル時間とは、現在のオペレーティングシステムが設定しているタイムゾーンのことです。例えば北京時間区は東8区で、現地時間:
2015-04-19 12:20:00
実はUTC+8:00タイムゾーンの時間です。
2015-04-19 12:20 UTC+8:00
今のグリニッジの標準時間は北京と8時間の差があります。つまりUTC+0:00の時間帯は次の通りです。
2015-04-19 04:20 UTC+0:00
timestampはUTC標準タイムゾーンに直接変換されることもできます。

>>> from datetime import datetime
>>> t = 1429417200.0
>>> print(datetime.fromtimestamp(t)) #     
2015-04-19 12:20:00
>>> print(datetime.utcfromtimestamp(t)) # UTC  
2015-04-19 04:20:00
strをdatetimeに変換します
多くの場合、ユーザーが入力した日付と時間は文字列で、日付と時間を処理するには、まずstrをdatetimeに変換しなければなりません。変換方法は、datetime.streptime()によって実現され、日付と時間の書式設定文字列が必要です。

>>> from datetime import datetime
>>> cday = datetime.strptime('2015-6-1 18:19:59', '%Y-%m-%d %H:%M:%S')
>>> print(cday)
2015-06-01 18:19:59
文字列'%Y-%m-%d %H:%M:%S'は、日付と時間の部分のフォーマットを規定している。詳細はPython文書を参照してください。
変換後のdatetimeにはタイムゾーン情報がありません。
datetimeはstrに変わります
すでにdatetimeオブジェクトがある場合、文字列として表示するには、strに変換する必要があります。変換方法はstrftime()によって実現されます。同様に日付と時間の書式設定文字列が必要です。

>>> from datetime import datetime
>>> now = datetime.now()
>>> print(now.strftime('%a, %b %d %H:%M'))
Mon, May 05 16:28
datetime加减
日付と時間を加減するということは、実はdatetimeを後にしたり前に計算したりして、新しいdatetimeが得られます。プラスマイナスは直接+と-演算子を使うことができますが、timedeltaというクラスを導入する必要があります。

>>> from datetime import datetime, timedelta
>>> now = datetime.now()
>>> now
datetime.datetime(2015, 5, 18, 16, 57, 3, 540997)
>>> now + timedelta(hours=10)
datetime.datetime(2015, 5, 19, 2, 57, 3, 540997)
>>> now - timedelta(days=1)
datetime.datetime(2015, 5, 17, 16, 57, 3, 540997)
>>> now + timedelta(days=2, hours=12)
datetime.datetime(2015, 5, 21, 4, 57, 3, 540997)
timedeltaを使うと、先日と数日後の時刻が簡単に計算できます。
ローカル時間をUTC時間に変換
ローカル時間とは、システムがタイムゾーンを設定する時間、例えば北京時間はUTC+8:00タイムゾーンの時間を指し、UTC時間はUTC+0:00タイムゾーンの時間を指す。datetimeタイプは、タイムゾーン属性tzinfoがありますが、デフォルトはNoneですので、このdatetimeはどのタイムゾーンなのかは区別できません。

>>> from datetime import datetime, timedelta, timezone
>>> tz_utc_8 = timezone(timedelta(hours=8)) #     UTC+8:00
>>> now = datetime.now()
>>> now
datetime.datetime(2015, 5, 18, 17, 2, 10, 871012)
>>> dt = now.replace(tzinfo=tz_utc_8) #      UTC+8:00
>>> dt
datetime.datetime(2015, 5, 18, 17, 2, 10, 871012, tzinfo=datetime.timezone(datetime.timedelta(0, 28800)))
もしシステムタイムゾーンがUTC+8:00であれば、上記のコードは正しいです。そうでなければ、強制的にUTC+8:00タイムゾーンに設定できません。
タイムゾーン変換
まずdatetimeを通じて現在のUTC時間を取得してから、任意のタイムゾーンの時間に変えられます。

#   UTC  ,        UTC+0:00:
>>> utc_dt = datetime.utcnow().replace(tzinfo=timezone.utc)
>>> print(utc_dt)
2015-05-18 09:05:12.377316+00:00
# astimezone()          :
>>> bj_dt = utc_dt.astimezone(timezone(timedelta(hours=8)))
>>> print(bj_dt)
2015-05-18 17:05:12.377316+08:00
# astimezone()          :
>>> tokyo_dt = utc_dt.astimezone(timezone(timedelta(hours=9)))
>>> print(tokyo_dt)
2015-05-18 18:05:12.377316+09:00
# astimezone() bj_dt         :
>>> tokyo_dt2 = bj_dt.astimezone(timezone(timedelta(hours=9)))
>>> print(tokyo_dt2)
2015-05-18 18:05:12.377316+09:00
タイムゾーン変換の鍵はutcnow()を取得する時、正しいタイムゾーンを知るために、タイムゾーンを強制的に設定し、基準時間とします。
タイムゾーンのdatetimeを利用して、datetime方法により、任意のタイムゾーンに変換することができます。
注:UTC+0:00タイムゾーンから他のタイムゾーンに変換しなければならないわけではなく、タイムゾーンastimezone()は、上記datetimeからbj_dtへの変換など、正確に変換できます。
結び目tokyo_dtによって表される時間は、エリア情報を必要として、特定の時間を決定することができます。そうでなければ、ローカル時間と見なすことができます。datetimeを記憶する場合、最適な方法は、タイムゾーンとは全く関係がないので、timestampの値をtimestampに変換して再記憶することである。
以上はpython datetimeモジュールの詳細を説明します。python datetimeモジュールに関する詳細は他の関連記事に注目してください。