時間の話が続くが、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」でぐぐるといろいろ出てきます。