プログラミングでは、日付、時刻といった時間関係の表現や操作を行うことにたびたび直面することでしょう。
ここではPythonの標準ライブラリーにあるdatetimeモジュールを使って、時間関係の操作を行っていきましょう。
datetimeモジュールには4つのオブジェクトがあります。
- datetime – 日付と時刻の両方を対象
- date – 年月日を対象
- time – 時分秒を対象
- timedelta – 日付と時刻の間隔を対象
これらを順に見て行きましょう。
datetimeモジュール
datetimeをインポートして、それぞれのオブジェクトを使ってみましょう。
import datetime
datetime – 日付と時刻
まずはdatetimeモジュールの中のdatetimeを使ってみましょう。これは日付と時刻の両方を対象にしています。
現在時刻をnow()を使って取得してみましょう。
import datetime
now = datetime.datetime.now()
print(now)
print(now.isoformat())
print(now.strftime('%d/%m/%y-%H%M%S%f'))
now()で現在時刻を取得し、出力しています。次はisoformat()を使って国際標準のISO規格で表示しています。最後はstrftime()を使って自分で表示の変更をしています。日時の表示に%d/%m/%yなどを使っていますが、これはあとでまとめます。
実行するとこうなります。(ファイル名date_time.pyでAtomで実行しています)
一度に実行しているので、全て現在時刻が表示されています。isoformat()の表示のTは、日付と時刻の分割を意味しています。
date – 年月日
次はdateを使ってみます。これは年月日を対象にしています。
今日の日付をtoday()を使って表示してみます。
import datetime
today = datetime.date.today()
print(today)
print(today.isoformat())
print(today.strftime('%d/%m/%y'))
today()で今日の日付を取得し出力しています。時刻の部分が無いだけであとはdatetimeと同じ処理をしています。
実行するとこうなります。
今日の日付がそれぞれのフォーマットで出力されています。
time – 時分秒
timeは時分秒を対象としています。
ここではtime()を使って、任意の時刻を表示してみます。
import datetime
t = datetime.time(hour=12, minute=34, second=56, microsecond=100)
print(t)
print(t.isoformat())
print(t.strftime('%H-%M-%S-%f'))
time()を使って、時分秒マイクロ秒をそれぞれhour=12, minute=34, second=56, microsecond=100と指定して表示しています。
指定した時分秒でそれぞれのフォーマットで表示されています。
timedelta – 日付と時刻の間隔
timedeltaは日付と時刻の間隔を対象としています。
timedelta()を使って現在時刻からの差を出してみましょう。
import datetime
now = datetime.datetime.now()
print(now)
d = datetime.timedelta(weeks=1)
print(now - d)
# d = datetime.timedelta(week=-1)
# print(now + d)
d = datetime.timedelta(days=365)
print(now - d)
まずdatetime.now()で現在時刻を取得しています。timedelta()にweeks=1を指定して1週間の差を出しています。現在時刻からこの値を引くことで1週間前の時刻を表示している訳です。コメントアウトしてる書き方は全く同じ意味です。1週間前を−1と指定して、現在時刻に加えています。最後はdaysに365を指定して、1年前の時刻を表示しています。
実行するとこうなります。
それぞれ現在時刻から、1週間前、1年前の時刻が表示されています。時刻というよりも日付ですね。
もちろん、hours、minutes、seconds、micorsecondsの指定もできます。
strftime()の書式指定子
strftime()で日時の表示を好きなように変えましたが、その書き方の書式指定子は次のようにまとめることができます。
書式指定子 | 意味 | 範囲 |
%Y | 年 | 1900-… |
%m | 月 | 01-12 |
%B | 月名 | January, … |
%b | 月略称 | Jan, … |
%d | 日 | 01-31 |
%A | 曜日 | Sunday, … |
%a | 曜日略称 | Sun, … |
%H | 時間(24時) | 00-23 |
%I | 時間(12時) | 01-12 |
%M | 分 | 00-59 |
%S | 秒 | 00-59 |
strftime()で日時を書き換える時、これを参考に当てはめましょう。
エポックタイムのtimeモジュール
datetimeのtimeと違い、UNIX時間を表すtimeモジュールがあります。これは1970年1月1日を基準に秒数でカウントしたものです。(エポックタイムなどとも言います)
time
timeをインポートして、次のようにして取得できます。
import time
print(time.time()) #エポックタイム
こちらはtimeモジュールのtime()です。
実行してみます。
1970年1月1日からコード実行時までの秒数が表示されています。
sleep
このtimeでよく目にするのがtime.sleep()です。サーバーに接続した時などに数秒感覚を開けて再度接続するようなシーンで見かけます。
次のコードでやってやってみましょう。
import time
print("time.sleep(5)を指定しました。")
time.sleep(5)
print("こちらは5秒後に表示されます。")
まず文を出力して、sleep(5)で5秒スリープさせています。5秒後に下側の文が表示されることになります。
実行してみましょう。
上側の文が表示されて、プロンプト表示になって止まっています。
5秒後に下側の文が表示されました。
まとめ
ここでは、Pythonの標準ライブラリーにあるdatetimeモジュールを使って、時間関係の操作を行ってきました。
日付と時刻の両方を対象とするdatetime、年月日を対象とするdate、時分秒を対象とするtime、日付と時刻の間隔を対象とするtimedeltaがあります。
日時の表示には、isoformat()を使うと国際標準のISO規格で表示します。strftime()では書式指定子を使って自由な形に表示できます。
datetimeのtimeと違い、1970年1月1日を基準としたUNIX時間で操作するtimeモジュールもあります。