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タイムゾーンでは tznamedailight フラグや 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

See also

time
本モジュールの標準ライブラリドキュメント
datetime
日付と時間の計算をするクラスを提供する datetime モジュール
calendar
カレンダーを生成したり、定期的なイベントを計算したりする高レベルな日付関数
Bookmark and Share