タイムスタンプ

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

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です