note.nkmk.me

Pythonで現在時刻・日付・日時を取得

Date: 2019-02-04 / tags: Python

Pythonで現在時刻を取得するには標準ライブラリのtimeモジュールかdatetimeモジュールを使う。UNIX時間(エポック秒)で取得したい場合はtimeモジュール、日時(日付と時刻)を表すdatetimeオブジェクトなどで取得したい場合はdatetimeモジュール。

ここでは以下の内容について説明する。

  • 現在時刻のUNIX時間(エポック秒)を取得: time.time()
  • 現在日時のdatetimeオブジェクトを取得: datetime.now()
    • タイムゾーンの設定
  • 今日の日付のdateオブジェクトを取得: date.today()
  • 現在時刻のtimeオブジェクトを取得

datetimeモジュールについての基本的な内容は以下の記事を参照。

スポンサーリンク

現在時刻のUNIX時間(エポック秒)を取得: time.time()

UNIX時間(エポック秒)はUTC(協定世界時)の1970年1月1日0時0分0秒からの経過秒数。

timeモジュールのtime()関数を使うと現在のUNIX時間(エポック秒)を浮動小数点数float型で取得できる。

import time

ut = time.time()

print(ut)
# 1549281692.9876952

print(type(ut))
# <class 'float'>

これを利用すると処理の経過時間を測定することもできる。

UNIX時間(エポック秒)とdatetimeモジュールのdatetimeオブジェクトなどとの相互変換については以下の記事を参照。

以降で説明するように、現在時刻のdatetimeオブジェクトを取得するには専用の関数が用意されている。

現在日時のdatetimeオブジェクトを取得: datetime.now()

現在日時(日付と時刻)のdatetimeオブジェクトを取得するにはdatetime.now()を使う。

import datetime

dt_now = datetime.datetime.now()

print(dt_now)
# 2019-02-04 21:04:15.412854

print(type(dt_now))
# <class 'datetime.datetime'>

datetimeオブジェクトは任意の書式の文字列に変換可能。

print(dt_now.strftime('%Y年%m月%d日 %H:%M:%S'))
# 2019年02月04日 21:04:15

print(type(dt_now.strftime('%Y年%m月%d日 %H:%M:%S')))
# <class 'str'>

print(dt_now.isoformat())
# 2019-02-04T21:04:15.412854

print(type(dt_now.isoformat()))
# <class 'str'>

また、属性で年year、月month、日day、時間hour、分minute、秒second、マイクロ秒microsecondを整数intで取得できる。

print(dt_now.year)
# 2019

print(dt_now.month)
# 2

print(dt_now.day)
# 4

print(dt_now.hour)
# 21

print(dt_now.minute)
# 4

print(dt_now.second)
# 15

print(dt_now.microsecond)
# 412854

print(type(dt_now.year))
# <class 'int'>

タイムゾーンの設定

タイムゾーンを考慮する場合は注意が必要。datetimeオブジェクトのタイムゾーンについての詳細は以下の記事を参照。

デフォルトではtzinfo属性がNoneのnaiveなオブジェクトでローカルな日時が返される。例は日本標準時(JST)の環境で実行しているので日本標準時における現在日時の値となる。

dt_now = datetime.datetime.now()

print(dt_now)
# 2019-02-04 21:04:15.412854

print(type(dt_now))
# <class 'datetime.datetime'>

print(dt_now.tzinfo)
# None

datetime.now()の引数にtimezoneオブジェクトを指定すると、それをもとにタイムゾーンが考慮されたawareなオブジェクトが返される。

dt_now_utc_aware = datetime.datetime.now(datetime.timezone.utc)

print(dt_now_utc_aware)
# 2019-02-04 12:04:15.561748+00:00

print(dt_now_utc_aware.tzinfo)
# UTC
dt_now_jst_aware = datetime.datetime.now(
    datetime.timezone(datetime.timedelta(hours=9))
)

print(dt_now_jst_aware)
# 2019-02-04 21:04:15.591827+09:00

print(dt_now_jst_aware.tzinfo)
# UTC+09:00

tzinfo属性がNoneのnaiveなオブジェクトでUTCの日時を返すdatetime.utcnow()もある。

dt_now_utc_naive = datetime.datetime.utcnow()

print(dt_now_utc_naive)
# 2019-02-04 12:04:15.621472

print(dt_now_utc_naive.tzinfo)
# None

今日の日付のdateオブジェクトを取得: date.today()

今日の日付のdateオブジェクトを取得するにはdate.today()を使う。

d_today = datetime.date.today()

print(d_today)
# 2019-02-04

print(type(d_today))
# <class 'datetime.date'>

date.today()はローカルな日付が返される。

dateオブジェクトはtzinfo属性を持たないが、タイムゾーンを考慮した日付を取得したい場合は、上述のdatetime.now()の引数を指定したりdatetime.utcnow()(UTCの場合)を使ったりして所望のタイムゾーンにおける日時の値をもつdatetimeオブジェクトを生成してからdate()メソッドでdateオブジェクトに変換する。

d_today_utc = datetime.datetime.utcnow().date()

print(d_today_utc)
# 2019-02-04

print(type(d_today_utc))
# <class 'datetime.date'>

例ではどちらも変わらないが、時差によって日付をまたぐようなタイミングだと異なる結果となる。

現在時刻のtimeオブジェクトを取得

datetimeモジュールには時刻を表すtime型もあるが、現在時刻をtimeオブジェクトとして取得する関数は用意されていない(Python3.7時点)。

datetimeオブジェクトを生成してからtime()メソッドでtimeオブジェクトに変換できる。

t_now = datetime.datetime.now().time()

print(t_now)
# 21:04:15.782546

print(type(t_now))
# <class 'datetime.time'>

print(t_now.tzinfo)
# None

time()メソッドだと元のdatetimeオブジェクトにtzinfo属性が設定されていても無視される。

dt_now_utc_aware = datetime.datetime.now(datetime.timezone.utc)

print(dt_now_utc_aware)
# 2019-02-04 12:04:15.838464+00:00

print(dt_now_utc_aware.tzinfo)
# UTC

print(dt_now_utc_aware.time())
# 12:04:15.838464

print(dt_now_utc_aware.time().tzinfo)
# None

tzinfo属性を保持したい場合はtimetz()メソッドを使う。

print(dt_now_utc_aware.timetz())
# 12:04:15.838464+00:00

print(dt_now_utc_aware.timetz().tzinfo)
# UTC
スポンサーリンク
シェア
このエントリーをはてなブックマークに追加

関連カテゴリー

関連記事