time – 時間を扱う関数¶
目的: | 時間を扱う関数 |
---|---|
利用できるバージョン: | 1.4 以上 |
time モジュールは、日付と時間を扱う C 言語のライブラリ関数を提供します。それは C 言語の実装に関連付けられているので、(エポックの開始やサポートされている最大日付の値といった)詳細のいくつかははプラットフォーム固有になります。完全な詳細については、標準ライブラリドキュメントを参照してください。
ウォールクロック時間¶
time モジュールのコア関数の1つは、小数でエポック秒を返す time() です。
import time
print 'The time is:', time.time()
その値は必ず小数が返されますが、実際の精度はプラットフォームに依存しています。
$ python time_time.py
The time is: 1205079300.54
小数表現は、値を保持したり日付を比較するのに便利ですが、人間が分かり易い表現ではありません。ログまたは時間を表示するには ctime() の方が分かり易いです。
import time
print 'The time is :', time.ctime()
later = time.time() + 15
print '15 secs from now :', time.ctime(later)
2行目の出力は、現在の時間以外の時間を表す ctime() の使用方法を紹介します。
$ python time_ctime.py
The time is : Sun Mar 9 12:18:02 2008
15 secs from now : Sun Mar 9 12:18:17 2008
プロセッサクロックタイム¶
time() がウォールクロックタイムを返す一方、 clock() はプロセッサクロックタイムを返します。 clock() の値は、パフォーマンステスト、ベンチマーク等に使用されます。それはプログラムが使用した実際の時間が反映されるので time() よりも精度の高い値になります。
import hashlib
import time
# md5 を計算するのに使用するデータ
data = open(__file__, 'rt').read()
for i in range(5):
h = hashlib.sha1()
print time.ctime(), ': %0.3f %0.3f' % (time.time(), time.clock())
for i in range(100000):
h.update(data)
cksum = h.digest()
このサンプルでは、ループ処理でフォーマット済みの ctime() と一緒に time() と clock() の値を表示します。自分のシステム上でこのサンプルを実行したいなら、違いが実際に分かるように内部ループ処理でもっとサイクルを追加するか、大量のデータを処理するように変更する必要があります。
$ python time_clock.py
Sun Mar 9 12:41:53 2008 : 1205080913.260 0.030
Sun Mar 9 12:41:53 2008 : 1205080913.682 0.440
Sun Mar 9 12:41:54 2008 : 1205080914.103 0.860
Sun Mar 9 12:41:54 2008 : 1205080914.518 1.270
Sun Mar 9 12:41:54 2008 : 1205080914.932 1.680
通常はプログラム内で何もしない場合、プロセッサクロックは時を刻みません。
import time
for i in range(6, 1, -1):
print '%s %0.2f %0.2f' % (time.ctime(), time.time(), time.clock())
print 'Sleeping', i
time.sleep(i)
このサンプルのループ処理は、ループ毎に sleep() することで小さな処理を実装します time() の値は、アプリケーションが sleep() 中であっても増加しますが、 clock() の値は違います。
$ python time_clock_sleep.py
Sun Mar 9 12:46:36 2008 1205081196.20 0.02
Sleeping 6
Sun Mar 9 12:46:42 2008 1205081202.20 0.02
Sleeping 5
Sun Mar 9 12:46:47 2008 1205081207.20 0.02
Sleeping 4
Sun Mar 9 12:46:51 2008 1205081211.20 0.02
Sleeping 3
Sun Mar 9 12:46:54 2008 1205081214.21 0.02
Sleeping 2
sleep() を呼び出すと、カレントスレッドから制御が移動して、戻って処理を続行するためにシステムに待つように求めます。プログラムが1つのスレッドのみなら、これはアプリケーションを効率的にブロックして処理を行いません。
struct_time¶
経過した秒数を保持しておくと状況によって役に立ちますが、 date の個々のフィールド(年、月等)へアクセス必要があるときもあります。 time モジュールは、分割したコンポーネントに日付と時間の値を保持する struct_time クラスを定義しているので、簡単にアクセスできます。また小数ではなく struct_time の値を処理する関数があります。
import time
print 'gmtime :', time.gmtime()
print 'localtime:', time.localtime()
print 'mktime :', time.mktime(time.localtime())
print
t = time.localtime()
print 'Day of month:', t.tm_mday
print ' Day of week:', t.tm_wday
print ' Day of year:', t.tm_yday
gmtime() は UTC で現在の時間を返します。 localtime() は現在のタイムゾーンで現在の時間を返します。 mktime() は struct_time を受け取り、それを小数表現に変換します。
$ python time_struct.py
gmtime : (2008, 3, 9, 16, 58, 19, 6, 69, 0)
localtime: (2008, 3, 9, 12, 58, 19, 6, 69, 1)
mktime : 1205081899.0
Day of month: 9
Day of week: 6
Day of year: 69
時間を解析して整形する¶
strptime() と strftime() の2つの関数は、時間の値による表現を struct_time と文字列の間で変換します。異なるスタイルで入力と出力をサポートするために利用できるフォーマットのリストがあります。完全なリストは time モジュールの標準ライブラリドキュメントに記載されています。
このサンプルは文字列の現在の時間を struct_time インスタンスに変換してから文字列へ戻します。
import time
now = time.ctime()
print now
parsed = time.strptime(now)
print parsed
print time.strftime("%a %b %d %H:%M:%S %Y", parsed)
月の日付はゼロが接頭辞に付くので、入力と文字列の出力は厳密に同じではありません。
$ python time_strptime.py
Sun Mar 9 13:01:19 2008
(2008, 3, 9, 13, 1, 19, 6, 69, -1)
Sun Mar 09 13:01:19 2008
タイムゾーンを扱う¶
現在の時間を決める関数は、実行するプログラムか、システムのデフォルトタイムゾーンを使用するかのどちらかのタイムゾーンに依存します。タイムゾーンを変更しても実際の時間は変更されません。ただ表現の方法が変わるだけです。
タイムゾーンを変更するには、環境変数 TZ をセットしてから tzset() を呼び出してください。 TZ を使用すると、多くの詳細をもつタイムゾーンを指定できます。すぐにサマータイムを開始して終了させてみましょう。ライブラリにその他の情報も派生してしまいますが、普通はタイムゾーン名を使用する方が簡単です。
このサンプルでは、タイムゾーンを変更して time モジュールの他の設定にどのような影響があるかを表示します。
import time
import os
def show_zone_info():
print '\tTZ :', os.environ.get('TZ', '(not set)')
print '\ttzname:', time.tzname
print '\tZone : %d (%d)' % (time.timezone, (time.timezone / 3600))
print '\tDST :', time.daylight
print '\tTime :', time.ctime()
print
print 'Default :'
show_zone_info()
for zone in [ 'US/Eastern', 'US/Pacific', 'GMT', 'Europe/Amsterdam' ]:
os.environ['TZ'] = zone
time.tzset()
print zone, ':'
show_zone_info()
私のデフォルトのタイムゾーンは US/Eastern なので TZ を設定しても何の影響もありません。別のlタイムゾーンでは tzname 、 dailight フラグや offset の値を変更します。
$ python time_timezone.py
Default :
TZ : (not set)
tzname: ('EST', 'EDT')
Zone : 18000 (5)
DST : 1
Time : Sun Mar 9 13:06:53 2008
US/Eastern :
TZ : US/Eastern
tzname: ('EST', 'EDT')
Zone : 18000 (5)
DST : 1
Time : Sun Mar 9 13:06:53 2008
US/Pacific :
TZ : US/Pacific
tzname: ('PST', 'PDT')
Zone : 28800 (8)
DST : 1
Time : Sun Mar 9 10:06:53 2008
GMT :
TZ : GMT
tzname: ('GMT', 'GMT')
Zone : 0 (0)
DST : 0
Time : Sun Mar 9 17:06:53 2008
Europe/Amsterdam :
TZ : Europe/Amsterdam
tzname: ('CET', 'CEST')
Zone : -3600 (-1)
DST : 1
Time : Sun Mar 9 18:06:53 2008