Python 日付と時刻の完全マスター:実践的ガイド
Python プログラムは、日付と時刻をいくつかの方法で扱えます。日付フォーマット間の変換はコンピュータの一般的な作業です。Python の time モジュールと calendar モジュールは、日付と時刻の追跡に役立ちます。
ティック(Tick)とは
時間間隔は、秒単位の浮動小数点数で表されます。特定の時点は、1970 年 1 月 1 日 00:00:00(エポック)からの秒数で表現されます。
Python には time という一般的なモジュールがあり、時刻の操作や表現間の変換のための関数を提供します。関数 time.time() は、1970 年 1 月 1 日 00:00:00(エポック)からの現在のシステム時刻をティック単位で返します。
例
ライブ デモ#!/usr/bin/python import time # time モジュールをインクルードするために必要 ticks = time.time() print "Number of ticks since 12:00am, January 1, 1970:", ticks
次のような結果が得られます。
Number of ticks since 12:00am, January 1, 1970: 7186862.73399
ティックを使用すると日付計算が簡単です。しかし、エポックより前の日付はこの形式で表現できません。遠い未来の日付もこの方法では表現できません。カットオフポイントは、UNIX と Windows では 2038 年ごろです。
TimeTuple(タイムタプル)とは
Python の多くの time 関数は、以下のように 9 個の数値のタプルとして時刻を扱います。
| インデックス | フィールド | 値 |
|---|---|---|
| 0 | 4桁の年 | 2008 |
| 1 | 月 | 1 から 12 |
| 2 | 日 | 1 から 31 |
| 3 | 時 | 0 から 23 |
| 4 | 分 | 0 から 59 |
| 5 | 秒 | 0 から 61(60 または 61 は閏秒) |
| 6 | 曜日 | 0 から 6(0 は月曜日) |
| 7 | 年内通算日 | 1 から 366(ユリウス日) |
| 8 | 夏時間 | -1, 0, 1。-1 はライブラリが DST を決定 |
上記のタプルは struct_time 構造体と等価です。この構造体には以下の属性があります。
| インデックス | 属性 | 値 |
|---|---|---|
| 0 | tm_year | 2008 |
| 1 | tm_mon | 1 から 12 |
| 2 | tm_mday | 1 から 31 |
| 3 | tm_hour | 0 から 23 |
| 4 | tm_min | 0 から 59 |
| 5 | tm_sec | 0 から 61(60 または 61 は閏秒) |
| 6 | tm_wday | 0 から 6(0 は月曜日) |
| 7 | tm_yday | 1 から 366(ユリウス日) |
| 8 | tm_isdst | -1, 0, 1。-1 はライブラリが DST を決定 |
現在時刻の取得
エポックからの秒数 という浮動小数点値からタイムタプルに変換するには、その浮動小数点値を関数(例:localtime)に渡します。この関数は、すべての 9 項目が有効なタイムタプルを返します。
ライブ デモ#!/usr/bin/python import time localtime = time.localtime(time.time()) print "Local current time :", localtime
次の結果が得られます。これは他の表示形式にもフォーマット可能です。
Local current time : time.struct_time(tm_year=2013, tm_mon=7, tm_mday=17, tm_hour=21, tm_min=26, tm_sec=3, tm_wday=2, tm_yday=198, tm_isdst=0)
フォーマット済み時刻の取得
要件に応じて任意の時刻をフォーマットできますが、読みやすい形式で時刻を取得する簡単な方法は asctime() です。
ライブ デモ#!/usr/bin/python import time localtime = time.asctime(time.localtime(time.time())) print "Local current time :", localtime
次の結果が得られます。
Local current time : Tue Jan 13 10:17:09 2009
月間カレンダーの取得
calendar モジュールは、年単位および月単位のカレンダーを操作する幅広いメソッドを提供します。ここでは、指定された月(2008 年 1 月)のカレンダーを出力します。
ライブ デモ#!/usr/bin/python import calendar cal = calendar.month(2008, 1) print "Here is the calendar:" print cal
次の結果が得られます。
Here is the calendar:
January 2008
Mo Tu We Th Fr Sa Su
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
time モジュール
時刻の操作と表現間の変換のための関数を提供する一般的な time モジュールが Python にあります。利用可能なすべてのメソッドの一覧:
| 番号 | 関数と説明 |
|---|---|
| 1 | time.altzone ローカル DST タイムゾーンのオフセット(UTC から西への秒数)。ローカル DST タイムゾーンが UTC の東にある場合(西ヨーロッパ、英国など)、負の値になります。daylight が非ゼロの場合のみ使用。 |
| 2 | time.asctime([tupletime]) タイムタプルを受け取り、'Tue Dec 11 18:07:14 2008' のような読みやすい 24 文字の文字列を返す。 |
| 3 | time.clock() 現在の CPU 時間を浮動小数点数(秒)で返す。異なるアプローチの計算コストを測定するには、time.clock の値の方が time.time() より有用。 |
| 4 | time.ctime([secs]) asctime(localtime(secs)) と同様。引数なしの場合は asctime() と同様。 |
| 5 | time.gmtime([secs]) エポックからの秒数で表される瞬間を受け取り、UTC 時刻のタイムタプル t を返す。注意:t.tm_isdst は常に 0。 |
| 6 | time.localtime([secs]) エポックからの秒数で表される瞬間を受け取り、ローカル時刻のタイムタプル t を返す(t.tm_isdst は、ローカルルールによって瞬時 secs に DST が適用されるかどうかにより 0 または 1)。 |
| 7 | time.mktime(tupletime) ローカル時刻で表されるタイムタプルとしての瞬間を受け取り、エポックからの秒数で表される浮動小数点値を返す。 |
| 8 | time.sleep(secs) 呼び出しスレッドを secs 秒間一時停止。 |
| 9 | time.strftime(fmt[,tupletime]) ローカル時刻で表されるタイムタプルとしての瞬間を受け取り、文字列 fmt で指定された形式で瞬時を表す文字列を返す。 |
| 10 | time.strptime(str, fmt='%a %b %d %H:%M:%S %Y') 文字列 str をフォーマット文字列 fmt に従って解析し、タイムタプル形式で瞬間を返す。 |
| 11 | time.time() 現在の時刻瞬間、エポックからの秒数の浮動小数点数を返す。 |
| 12 | time.tzset() ライブラリルーチンで使用される時刻変換ルールをリセット。環境変数 TZ でこれを指定。 |
time モジュールには以下の 2 つの重要な属性があります。
| 番号 | 属性と説明 |
|---|---|
| 1 | time.timezone 属性 time.timezone は、ローカルタイムゾーン(DST なし)の UTC からのオフセット(秒)。(アメリカでは >0、ヨーロッパ、アジア、アフリカの大部分では <=0) |
| 2 | time.tzname |
calendar モジュール
calendar モジュールは、指定された月または年のテキストカレンダーを印刷する関数など、カレンダー関連の関数を提供します。
デフォルトでは、calendar は月曜日を週の最初の日、日曜日を最後の日として扱います。これを変更するには、calendar.setfirstweekday() 関数を呼び出します。
calendar モジュールで利用可能な関数の一覧:
| 番号 | 関数と説明 |
|---|---|
| 1 | calendar.calendar(year, w=2, l=1, c=6) 年 year のカレンダーを、c スペースで区切られた 3 列にフォーマットした複数行の文字列を返す。w は各日付の文字幅、各行の長さは 21*w+18+2*c。l は週ごとの行数。 |
| 2 | calendar.firstweekday() 週の開始曜日として現在設定されている曜日コードを返す。デフォルトでは、calendar を最初にインポートしたとき、これは 0(月曜日を意味する)。 |
| 3 | calendar.isleap(year) year が閏年なら True、そうでなければ False を返す。 |
| 4 | calendar.leapdays(y1, y2) range(y1, y2) の範囲内の年数における閏日の総数を返す。 |
| 5 | calendar.month(year, month, w=2, l=1) 年 year の月 month のカレンダーを、週ごと 1 行プラス 2 ヘッダー行の複数行文字列で返す。w は各日付の文字幅、各行の長さは 7*w+6。l は週ごとの行数。 |
| 6 | calendar.monthcalendar(year, month) 整数のリストのリストを返す。各サブリストは 1 週間を表す。年 year の月 month の範囲外の日は 0、範囲内の日はその月日(1 以上)に設定される。 |
| 7 | calendar.monthrange(year, month) 2 つの整数を返す。最初は年 year の月 month の最初の日の曜日コード、2 番目はその月の日数。曜日コードは 0(月曜日)から 6(日曜日)、月番号は 1 から 12。 |
| 8 | calendar.prcal(year, w=2, l=1, c=6) print calendar.calendar(year, w, l, c) と同様。 |
| 9 | calendar.prmonth(year, month, w=2, l=1) print calendar.month(year, month, w, l) と同様。 |
| 10 | calendar.setfirstweekday(weekday) 各週の最初の日を曜日コード weekday に設定。曜日コードは 0(月曜日)から 6(日曜日)。 |
| 11 | calendar.timegm(tupletime) time.gmtime の逆関数:タイムタプル形式の時刻瞬間を受け取り、同じ瞬間をエポックからの秒数の浮動小数点数で返す。 |
| 12 | calendar.weekday(year, month, day) 指定された日付の曜日コードを返す。曜日コードは 0(月曜日)から 6(日曜日)、月番号は 1(1月)から 12(12月)。 |
その他のモジュールと関数
興味があれば、Python で日付と時刻を操作するためのその他の重要なモジュールと関数のリストを以下に示します。
datetime モジュール
pytz モジュール
dateutil モジュール
Python
- Python データ型マスター: 実践ガイド
- Python 演算子完全マスター: 包括的ガイド
- Python pass文完全マスター: 実践ガイド
- Python 関数引数完全マスター: 位置引数・キーワード引数・デフォルト引数
- Python辞書完全ガイド:作成、操作、高度なテクニック
- Python datetimeマスター:日付・時刻・タイムゾーン実践ガイド
- Pythonで現在の日付と時刻を取得する実践ガイド
- Pythonで現在時刻とタイムゾーンデータを簡単に取得する
- Pythonのtimeモジュールをマスター:関数、構造体、実践例
- Pythonのtime.sleep()をマスター:ベストプラクティス、マルチスレッド、実例
- Java日付時刻完全ガイド:Date/Calendar/SimpleDateFormat/printf