Pythonに標準で付属するdatetimeモジュールとtimeモジュールを使って、現在の日付と時刻を取得する方法を紹介する。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
* 本稿は2021年11月2日に公開された記事をPython 3.12.3で動作確認し、Python 3.12においてdatetime.datetime.utcnowクラスメソッドが非推奨になったことを追記したものです(確認日:2024年4月12日)。
# datetimeモジュールを使った現在の日付と時刻の取得
import datetime
dt = datetime.datetime.today() # ローカルな現在の日付と時刻を取得
print(dt) # 2021-10-29 15:58:08.356501
# 日付と時刻を構成する要素の取り出し
print(f'year: {dt.year}, month: {dt.month}, day: {dt.day}')
print(f'hour: {dt.hour}, minute: {dt.minute}, second: {dt.second}')
print(f'micro second: {dt.microsecond}')
# 出力例
#year: 2021, month: 10, day: 29
#hour: 15, minute: 58, second: 8
#micro second: 356501
# datetimeオブジェクトから日付または時刻を取り出す
d = dt.date()
print(d) # 2021-10-29
t = dt.time()
print(t) # 15:58:08.356501
tdy = datetime.date.today() # 今日の日付の取得
print(tdy) # 2021-10-29
# タイムゾーンを考慮する
dt = datetime.datetime.now() # タイムゾーンなしで現在の日付と時刻を取得
print(dt) # 2021-10-29 16:16:23.202059
dt = datetime.datetime.now(datetime.timezone.utc) # タイムゾーン付きでUTCを取得
print(dt) # 2021-10-29 07:23:14.464801+00:00
print(dt.tzinfo) # UTC
dt = datetime.datetime.utcnow() # タイムゾーンなしでUTCを取得
print(dt) # 2021-10-29 07:31:41.503042
t_delta = datetime.timedelta(hours=9) # 9時間
JST = datetime.timezone(t_delta, 'JST') # UTCから9時間差の「JST」タイムゾーン
dt = datetime.datetime.now(JST) # タイムゾーン付きでローカルな日付と時刻を取得
print(dt)
# timeモジュールを使った現在の日付と時刻の取得
import time
t = time.time() # UNIX時間(1970/01/01 00:00:00からの経過時刻)を取得
dt_from_timestamp = datetime.datetime.fromtimestamp(t)
print(dt_from_timestamp) # 2021-10-29 16:59:04.741680
c_time = time.ctime(t) # UNIX時刻を文字列表現に変換
print(c_time) # Fri Oct 29 16:59:04 2021
local_time = time.localtime(t) # ローカル時刻をtime.struct_time型として取得
print(local_time)
gm_time = time.gmtime(t) # UTC時刻をtime.struct_time型として取得
print(gm_time)
# 出力例
#time.struct_time(tm_year=2021, tm_mon=10, tm_mday=29, tm_hour=16, tm_min=59,
# tm_sec=4, tm_wday=4, tm_yday=302, tm_isdst=0)
#time.struct_time(tm_year=2021, tm_mon=10, tm_mday=29, tm_hour=7, tm_min=59,
#tm_sec=4, tm_wday=4, tm_yday=302, tm_isdst=0)
asc_time = time.asctime(local_time) # 上のlocal_timeを文字列表現に変換
print(asc_time) # Fri Oct 29 16:59:04 2021
dt = datetime.datetime.strptime(asc_time, '%a %b %d %H:%M:%S %Y')
print(dt) # 2021-10-29 16:59:04
Pythonで現在の日付と時刻を取得するには幾つかの方法がある。代表的なものとしてはPythonに標準で付属するdatetimeモジュールまたはtimeモジュールを使う方法が挙げられる。まずはdatetimeモジュールを使う方法を見てみよう。
import datetime
dt = datetime.datetime.today() # ローカルな現在の日付と時刻を取得
print(dt) # 2021-10-29 15:58:08.356501
一番簡単な方法は上に示した、datetimeモジュールに含まれるdatetimeクラスのtodayクラスメソッドを呼び出すことだ。todayクラスメソッドが返送するのは、datetime.datetime型のオブジェクトであり、以下のようにyear/month/day/hour/minute/second/microsecond属性によって日付や時刻を構成する各要素にアクセスできる。
print(f'year: {dt.year}, month: {dt.month}, day: {dt.day}')
print(f'hour: {dt.hour}, minute: {dt.minute}, second: {dt.second}')
print(f'micro second: {dt.microsecond}')
# 出力例
#year: 2021, month: 10, day: 29
#hour: 15, minute: 58, second: 8
#micro second: 356501
あるいはstrftimeメソッドを呼び出して、日付と時刻を独自の書式でフォーマットすることも可能だが、これについては別稿で紹介する。
取得したdatetimeクラスのオブジェクトには、その日付を取り出すdateメソッドと時刻を取り出すtimeメソッドもある。使用例を以下に示す。
d = dt.date()
print(d) # 2021-10-29
t = dt.time()
print(t) # 15:58:08.356501
なお、今日の日付を取得するだけなら、以下のようにdatetimeモジュールに含まれるdateクラスのtodayクラスメソッドを呼び出してもよい。
tdy = datetime.date.today()
print(tdy) # 2021-10-29
dateメソッドの戻り値はdatetime.dateクラスのオブジェクトであり、timeメソッドの戻り値はdatetime.timeクラスのオブジェクトだ。これらにはdatetimeクラスのオブジェクトと同様、日付を構成する要素を表す属性と時刻を構成する要素を表す属性がある(例は省略)。
todayメソッドと同様に、datetimeクラスのnowクラスメソッドを呼び出しても現在の日付と時刻を取得できる。
dt = datetime.datetime.now() # タイムゾーンなしで現在の日付と時刻を取得
print(dt) # 2021-10-29 16:16:23.202059
todayメソッドを呼び出したり、nowメソッドを引数なしで呼び出したりした場合、得られる値はローカルな日付と時刻となる。この場合、datetimeオブジェクトにはタイムゾーン情報が含まれない(こうしたオブジェクトのことを「naive」と呼ぶ。逆にタイムゾーンなどの情報を含むオブジェクトのことを「aware」と呼ぶ)。
nowメソッドはタイムゾーンを指定して呼び出せる。その場合は、取得する日付と時刻は指定したタイムゾーンのものに変換される。以下はUTC(協定世界時)をタイムゾーンに指定してnowメソッドを呼び出す例だ。
dt = datetime.datetime.now(datetime.timezone.utc) # タイムゾーン付きでUTCを取得
print(dt) # 2021-10-29 07:23:14.464801+00:00
print(dt.tzinfo) # UTC
2つ目の出力ではタイムゾーンが「UTC」となっていること、その上の出力の最後にはそのことを裏付ける「+00:00」があることに注目してほしい。
なお、タイムゾーン情報なしでUTCを取得するutcnowメソッドもある(このメソッドはPython 3.12で非推奨となり、「datetime.datetime.now(datetime.UTC)」のようにしてUTCを取得することが推奨されている)。
dt = datetime.datetime.utcnow() # タイムゾーンなしでUTCを取得
print(dt) # 2021-10-29 07:31:41.503042
タイムゾーンを指定してnowメソッドを呼び出すには、datetime.timezoneクラスまたはdatetime.tzinfoクラスの派生クラスのインスタンスをnowメソッドに渡す。以下は、JST(日本標準時。UTC+9)を表すtimezoneクラスのインスタンスを作成して、それをnowメソッドに渡すことでJSTをタイムゾーンとするローカルな時刻を取得する例だ。
t_delta = datetime.timedelta(hours=9) # 9時間
JST = datetime.timezone(t_delta, 'JST') # UTCから9時間差の「JST」タイムゾーン
dt = datetime.datetime.now(JST) # タイムゾーン付きでローカルな日付と時刻を取得
print(dt) # 2021-10-29 16:44:02.888144+09:00
datetimeクラスのオブジェクトにタイムゾーンを設定するには、astimezoneメソッドを使えるが、これについてはPythonのドキュメントを参照されたい。
Copyright© Digital Advantage Corp. All Rights Reserved.