Pythonクックブック(3章)

昨日のめざせ会社の星を観てたら、「25分作業して5分休憩する」ってことをやってる人が出てた。
調べてみると、この方法「ポモドーロ・テクニック」って呼ばれてる時間管理術。
「○ポモドーロ」って見かけたり、翻訳本「アジャイルな時間管理術 ポモドーロテクニック入門」が出たりしてた。
「ポモドーロって何?」って気になったけど、その時は調べてなかったなぁ。
興味をもったらその時に調べる癖をつけんと、数日も経つと忘れてしまって、いつまで経っても解らんままだ。

timeモジュール

時刻データにアクセスするためのモジュール。
時刻の考え方は、UTCという世界標準時があり、そこからの時差を加味したローカル時間(日本ならJST)で表現される。

コンピュータでの時刻の管理方法は、時刻データをエポックと呼ばれる任意の時刻からの経過秒数で行っている。
エポックの値はプラットフォームに依存するが、通常1970年1月1日午前0時となっている
Pythonプログラムからは、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)
>>> time.gmtime(0).tm_year
1970

time.gmtime()は以下の整数値からなるstruct_time(シーケンス)を返してくれる。

Index Attribute Value
0 tm_year 年[4桁]
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]*1
6 tm_wday 曜日[0〜6]*2
7 tm_yday 1年の何日目か[0〜366]
8 tm_isdst サマータイムが有効(1)か否(0)か*3

コンピュータはepochからの経過秒数で時刻データを扱うが、
Pythonプログラムでの時刻データの扱い方は2種類ある。

  1. epochからの経過秒数として扱う
  2. struct_timeシーケンスとして扱う

Pythonプログラムで時刻を表示方法は以下の2種類ある。

  1. プログラムの内部データをそのまま表示する
  2. 人間に解りやすく加工して表示する
内部データをそのまま表示する。

出力をUTC/ローカル時間どちらで表示するのか、入出力の扱いをどうするのかで使う関数が異なる。

method 表示時刻 input output in/out反転
time.gmtime UTC epochからの秒数 struct_timeシーケンス calendar.timegm
time.localtime ローカル時間 epochからの秒数 struct_timeシーケンス time.mktime
time.strptime 文字列(,文字列形式) struct_timeシーケンス ???
人間に解りやすくして表示する。

出力の形式が固定*4/自由どちらで表示するのか、入力をどうするのかで使う関数が異なる。

method input 出力形式 表示時刻
time.asctime struct_timeシーケンス 固定 入力と同じ
time.ctime epochからの秒数 固定 ローカル時間
time.strftime struct_timeシーケンス 自由 入力と同じ

エポック以前は扱えないって書いてあるけど、2000年問題の所に1969とか書いてあるし、
実はエポック以前もいけるんじゃないかと思って試してみたけど、
epochからstruct_timeへの変換は"○"、struct_timeからepochへの変換は"×"って結果になった。

>>> time.localtime(-10**10)
time.struct_time(tm_year=1653, tm_mon=2, tm_mday=10, tm_hour=15, tm_min=32, tm_sec=19, tm_wday=0, tm_yday=41, tm_isdst=0)
>>> time.mktime(time.localtime(-10**10))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: year out of range
>>> 

色々試してみたら、tm_year=1900以降ならば動きはするらしい。まぁ、正しく動く保証は当然ないんだろうけど。

>>> time.mktime((1899,0,0,0,0,0,0,0,0))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: year out of range
>>> time.mktime((1900,0,0,0,0,0,0,0,0))
-2211786000.0
>>> 

参考サイト

モジュールインデックス@Python 2.6.2 document

Python クックブック 第2版

Python クックブック 第2版

*1:うるう秒や2重うるう秒のため61が存在

*2:0が月曜日

*3:不明な時は-1

*4:'Sun Jun 20 23:21:05 1993'