時間の話が続くが、Windowsのタイムスタンプ(ファイルの更新時刻など)は1601年元旦から何100nsecかかったか、の64ビットの数値である。Unixは御存知の通り1970年元旦からの秒数(構造体になってusもしくはnsがつくこともある)で、32ビットである。 というわけで、コンバートする必要があるのだが、閏年がたくさんあったりして、正確に求めるのが面倒だ。Pythonのコードでメモしておく。11644473600秒というのがマジックナンバー。1601年元旦から1970年元旦までには134774日の差がある。
# Windowsのファイル時刻 -> Unix time
# Windows: EPOCH = 1601-01-01 00:00.00 GMT から n*100nsec
# Unix : EPOCH = 1970-01-01 00:00.00 GMT から n*sec
# returns: (sec, usec)
# 不完全
def win2unixtime(t):
timediff=(int)((1970-1601)*365.2425)*24*60*60 # 11644473600
us=(t%10000000)/10
sec1=t/10000000 # WinEpochからの秒数
sec=sec1-timediff
return (sec,us)
暦としては、現在の暦では4年に1度の閏年、100年に一度の閏年回避、400年に一度の閏年回避の回避ということで、365+1/4-1/100+1/400 = 365.2425日ということになる。 「11644473600」でぐぐるといろいろ出てきます。