【Python】 現在時刻を取得する(time.time)

time.time()はUNIXエポックを基準点とした経過秒数を返す関数で、現在時刻を取得するのに便利です。
ただ、返り値の単位が「秒」、かつ浮動小数点型のため、何時何分なのかイマイチ分かり難いです。
そこで、datetimeモジュールを使って見やすく変換する方法についても紹介します。
また、この関数は、あるコードブロックの処理時間を計測するのに使われることもありますが、使う際には少し注意が必要です。そのあたりも併せてまとめてみました。
# 2019/12/2 記事更新

確認した環境

  • OS:Ubuntu16.04LTS
  • Python 3.7.4

現在時刻を取得する

timeモジュール は、時刻に関する様々な関数を提供しています。
このうちtime.time() は、Pythonプログラムからシステムクロックを読みだして現在時刻を取得することができます。

>>> import time
>>> time.time()
1541317313.336098

返り値はUNIXエポックからの経過秒数を示しており、浮動小数点数で表されます。

<参考>

  • UNIXエポック
  • UNIXエポック – UNIX時間(コンピュータシステム UNIXで内部的に使用される時刻表現)における紀元。協定世界時 (UTC) 1970年1月1日午前0時0分0秒を0とする。
    Wikipedia 「紀元」より引用

  • 経過秒数
  • UNIX時間とも呼ばれます。うるう秒の扱い等はプラットフォーム依存とのこと。

    UNIX時間(ユニックスじかん)またはUNIX時刻(ユニックスじこく、UNIX time(ユニックスタイム)、POSIX time(ポジックスタイム))とはコンピューターシステム上での時刻表現の一種。UNIXエポック、すなわち協定世界時 (UTC) での1970年1月1日午前0時0分0秒から形式的な経過秒数(すなわち、実質的な経過秒数から、その間に挿入された閏秒を引き、削除された閏秒を加えたもの)として表される。
    Wikipedia 「UNIX時間」より引用

ちなみに、今使っている環境でエポックが何かを知るには,time.gmtime(0)の値を見るとわかります。筆者の環境では、以下となりました。

>>> import time

# エポックを取得
>>> time.gmtime(0)
time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)

<参考その2>

また、time.time()は、あるコードブロックの処理時間の計測に使われることがあります。以下のように、計測したい処理の前後で時刻を取得し、両者の差分を計算すれば処理時間が得られます。

# 開始時刻の取得
t0 = time.time()

# 何らかの処理
result = cal()

# 終了時刻の取得
t1 = time.time()

# 処理時間(=終了時刻ー開始時刻)の出力
print('Cal time:{}'.format(t1-t0))

但し、time.time()で処理時間を計測する際は注意が必要です。というのは、この関数は

  • 2回呼び出しの間にシステムクロックが再起動等により、巻き戻る場合がある
  • 分解能はtime.perf_counter()やtime.monotonic()の方が良い

ためで、高い精度で確実に測定する場合はtime.perf_counter() を使ったほうが良さそうです。

(参考記事)【Python】コードの処理時間を計測する(time.perf_counter)

見やすい日付で表現する

time.time()で取得した値は、単位が「秒」のため人間が見るはちょっとわかりづらいです。
そこで、datetimeモジュール を使うともっと見やすい表記にすることができます。

datetime.fromtimestamp() time.time()が返す「UNIXエポックからの経過秒数」をローカルな日付と時刻に変換して返します。

戻り値はdatetimeオブジェクトで、年、月、日、時、分、秒、マイクロ秒の値を含みます。
例えば、現在の日付と時刻を取得してみます。

>>> import datetime
>>> datetime.datetime.fromtimestamp(time.time())
datetime.datetime(2019, 12, 2, 0, 7, 11, 120307)

次に、これを文字列に変換します。

strftime() を用いると、datetimeオブジェクトの返り値を任意の書式で表すことができます。
このメソッドに設定する書式のうち、よく使いそうなものを下表に示します。

書式内容
%Y西暦 (4桁) [1, 9999]
%m月 [01, 12]
%b月(現在地に合わせた月名)
[ Jan, Dec] (en_US)
%d日にち[01, 31]
%H時間(24時間表記)
[00, 23]
%I時間(12時間表記)
[01, 12]
%M分 [00, 59]
%S秒 [00, 59]
%pAM/PM
(現在地に合わせた表記)

実際はもっとたくさんあります。詳細は公式リファレンスを参照ください。

以下は、実際に試してみた例です。わかりやすくなりましたね。

>>> import time, datetime
>>> today = datetime.datetime.fromtimestamp(time.time())

>>> today.strftime('%Y/%m/%d %H:%M:%S')
'2019/12/02 00:08:58'

>>> today.strftime('%b %d, %Y %I:%M:%S%p')
'Dec 02, 2019 12:08:58AM'

(参考記事)【Python】 日付と時刻の表し方と演算(datetimeモジュール)

まとめ

  • time.time()はUNIX時間を基準とした経過時間を秒で返す関数。
  • ある2点間の時刻を取得しその差分を計算することによってプログラムの処理時間を計測することができるが、注意が必要。(今場合はできればtime.perf_counter()がおすすめ)
  • 現在時刻を見やすくするためには、datetimeモジュールが便利。

Learn more...

書籍でもう少し詳しく学びたい場合はこちらもどうぞ。筆者もかなり参考にさせてもらっています!

[Sponsor link]