エポックタイム(正式名称が分からず…)を変換する


  • unixエポック
    1970-01-01から1秒ずつカウントした時刻

  • windowsエポック
    1601-01-01から100ナノ秒ずつカウントした時刻

というように、システム上の時刻のようなものがあることは知っていたのですが、先日、Azureで0001-01-01から100ナノ秒ずつカウントした時刻が使われていることを知りました。

  • (仮称)Azureエポック
    0001-01-01から100ナノ秒ずつカウントした時刻

azコマンドのクエリ条件として使うために、一般的な日時形式と各エポックタイムの間で相互変換を行う必要があり、変換用のPythonスクリプトを作りました。


現在時刻のunixエポックを取得

これは普通のLinuxコマンドで実施できます。

date +%s

dateコマンドのほかのオプションも同時に使用可能です。


Pythonで一般的な日時形式とunixエポックを相互変換

これはdatetimeモジュールで実施できます。

datetime.datetime.fromtimestamp(unixtime)

unixエポックを一般的な日時形式に変換できます。


datetime.datetime.timestamp(datetime)

一般的な日時形式をunixエポックに変換できます。
ただし、日時形式の文字列を書くだけではだめで、datetimeの型にする必要があります。それもdatetimeモジュールで実施できますが、ここでは割愛します。


unixエポックをwindowsエポックに変換

#datetimeモジュールを使用
import datetime

#現在のunixエポックを入力
now_epochtime_unix = (unixtime)

#エポックタイム同士の秒数差を計算
unix_epoch = datetime.datetime(1970, 1, 1, tzinfo=datetime.timezone.utc)
windows_epoch = datetime.datetime(1601, 1, 1, tzinfo=datetime.timezone.utc)
epoch_delta_seconds = (unix_epoch - windows_epoch).total_seconds()

#unixエポックをwindowsエポックに変換(秒単位)
convert_time = now_epochtime_unix + epoch_delta_seconds

#windowsエポックは100ナノ秒単位なので、(100×10^-9)で割る
now_epochtime_windows = convert_time * 10**7
print(now_epochtime_windows)


#おまけ(unixエポックを変換して得られたwindowsエポックを整数で表示する)
print(int(now_epochtime_windows))

unixtimeのところに入力されたunixエポックに対して、エポックタイム同士の秒数差を足すことで、windowsエポックにすることができます。
途中の計算は秒単位で行いましたが、windowsエポックは100ナノ秒単位なので、最後に調整します。

windows_epochを以下のように変更すると、(仮称)Azureエポックについて、同様の変換を行うことができます。

windows_epoch = datetime.datetime(1, 1, 1, tzinfo=datetime.timezone.utc)


windowsエポックをunixエポックに変換

#datetimeモジュールを使用
import datetime

#現在のwindowsエポック(100ナノ秒単位)を入力、(100×10^-9)をかけて秒単位にする
now_epochtime_windows = (windowstime) / 10**7

#エポックタイム同士の秒数差を計算
unix_epoch = datetime.datetime(1970, 1, 1, tzinfo=datetime.timezone.utc)
windows_epoch = datetime.datetime(1601, 1, 1, tzinfo=datetime.timezone.utc)
epoch_delta_seconds = (unix_epoch - windows_epoch).total_seconds()

#windowsエポックをunixエポックに変換
convert_time = now_epochtime_windows - epoch_delta_seconds

#unixエポックは秒単位なので、単位の変換は不要
now_epochtime_unix = convert_time
print(now_epochtime_unix)


#おまけ(windowsエポックを変換して得られたunixエポックを一般的な日時形式にする)
now_datetime = datetime.datetime.fromtimestamp(now_epochtime_unix)
print(now_datetime)

windowstimeのところに入力されたwindowsエポックから、エポックタイム同士の秒数差を引くことで、unixエポックにすることができます。
最初にwindowsエポックを秒単位にしているので、最後に単位の調整を行う必要はありません。

こちらについても同じく、windows_epochを以下のように変更することで、(仮称)Azureエポックについて、同様の変換を行うことができます。

windows_epoch = datetime.datetime(1, 1, 1, tzinfo=datetime.timezone.utc)


いいなと思ったら応援しよう!