シェルスクリプトでunixtimeへ変換・unixtimeから変換をしてみる

Bash

はじめに

プロジェクトのテストフェーズでunixtimeの値が妥当かどうかを確認したかったのでコマンドライン上で確認した際に使ったコマンドを共有します。
せっかくなのでunixtimeへ変換・unixtimeから変換の両方についてまとめてみました。

両方とも date コマンドを使って実現できます。

検証環境

$ uname -moi
x86_64 MacBookPro11,4 Darwin
$ bash -version
GNU bash, バージョン 5.0.7(1)-release (x86_64-apple-darwin18.5.0)
$ date --version | head -n 1
date (GNU coreutils) 8.31

unixtimeから変換

unixtimeから日時表記の文字列に変換するには、 -d オプションの引数として @ + unixtime の形式で文字列を指定します。

$ date -d @1557961216
木  5 16 08:00:16 JST 2019
$ date -d @1557961216 +"%Y-%m-%d %H:%M:%S"
2019-05-15 23:00:16

unixtimeへ変換

-d オプションに渡す文字列として、数字の前に @ を付けると、 UNIX時間での指定になる。

現在日時から算出

$ date +%s
1557961791

指定した日時から算出

$ date -d "1979-09-30 12:34:56" +%s
307542896

余談:unixtimeの始まりの値と戯れる

余談ですが、 unixtimeは「1970-01-01 00:00:00」から始まります。

UNIXエポック、
すなわち協定世界時 (UTC) での1970年1月1日午前0時0分0秒から形式的な経過秒数(すなわち、
実質的な経過秒数から、
その間に挿入された閏秒を引き、
削除された閏秒を加えたもの)として表される。
(Wikipedia引用)

unixtimeが0になるか確認してみます。

$ date -d "1970-01-01 00:00:00" +%s
0
$ date -d "1970-01-01 00:00:01" +%s
1

「1970-01-01 00:00:00」以前のunixtimeを取得した場合はどうなるでしょう?

$ date -d "1969-01-01 00:00:00" +%s
-31536000
date @-31536000

マイナスになりました。

$ date -d @-31536000
Wed Jan  1 00:00:00 UTC 1969

復元もできるみたいですね。

そういえば、 2038年問題 なんてのもありましたが正しく処理できるのでしょうか。

$ date -d "2038-12-31 12:34:56" +%s
2177411696
$ date -d @2177411696
Fri Dec 31 12:34:56 UTC 2038

問題なく動作してますね。

Bash

Posted by genzouw