どのプログラミング言語/スクリプトでも、時刻と文字列の変換は頻出の処理ですね。
ここではPythonの標準モジュールdatetimeを使って基本的な日付・時刻の処理をまとめておきます。
datetimeオブジェクト
まずは基本から。現在時刻を取得してみましょう。
datetime.datetime
は時刻を含むオブジェクト。単に日付までならdatetime.date
オブジェクトがあります。
1 2 3 4 | import datetime dtnow = datetime.datetime.now() # >>> '2016-06-27T00:48:42.087504' |
タイムゾーンを指定したい時はやや面倒。
ちょっと調べてみましたが標準モジュールでは用意されておらず、別途外部のモジュール(pytz
)を使う例が多数派のようです。
1 2 3 | import datetime from pytz import timezone dtnow = datetime.datetime.now(timezone('UTC')) |
timezone()
コンストラクタの引数は柔軟に指定できるようで、'Asia/Tokyo'
や'Japan'
などが使えるもよう。
datetimeオブジェクト→文字列
単純に文字列が欲しい場合、ISOフォーマットやstr.format()
を使うのが楽。
1 2 3 4 5 6 7 8 9 10 | import datetime dtnow = datetime.datetime.now() # iso format print(dtnow.isoformat()) # >>> '2017-05-07T00:48:42.087504' # string print("{}".format(dtnow)) # >>> '2017-05-07 00:49:34.217637' |
ただし、ファイル名に使う場合などは記号(スラッシュやコロン)があると困るので、フォーマットを指定する方法が適切です。
1 2 3 4 5 6 7 8 | import datetime dtnow = datetime.datetime.now() # >>> datetime.datetime(2016, 10, 7, 20, 17, 43, 225355) # strftime print(dtnow.strftime('%Y-%m-%d, %H.%M.%S.%f')) # format print("{0:%Y-%m-%d, %H.%M.%S.%f}".format(dtnow)) |
strftime
のfはformatから来ているのでしょうか。
文字列→datetimeオブジェクト
datetimeオブジェクトは文字列をパースするメソッドstrptime
を持っています。
第一引数に文字列、第二引数にフォーマットを指定します。
1 2 3 4 | import datetime dtstr = "1985.12.25 14:20:33" dt = datetime.datetime.strptime(dtstr, '%Y.%m.%d %H:%M:%S') # >>> datetime.datetime(1985, 12, 25, 14, 20, 33) |
strptime
のpはparseから来ているのでしょうか。
datetimeオブジェクトを使った加減算
datetimeオブジェクトは加減算が可能で、時刻の差を表すdatetime.timedelta
オブジェクトを使います。次の例は、時間差がある特定の値以内であることを判定します。
1 2 3 4 5 6 | import datetime dtthen = datetime.datetime(2016, 1, 20) dtnow = datetime.datetime.now() if abs(dtthen - dtnow) < datetime.timedelta(days=50): print("true") |