🌞

UnixTime: Linux date コマンド, Google SpreadSheet, LibreOffice, Swift

に公開

UnixTime: Linux date コマンド, Google SpreadSheet, LibreOffice, Swift

2025-01-08


(1).背景・何がしたかったか

  • UnixTimeを使おうとしたら、使っている物で値が違って戸惑った
    • 整理しよう!

(2).環境

  • Linux
    • date (GNU coreutils) 9.4
    • Google SpreadSheet
    • LibreOffice 7.4

(3).dateコマンド

3-1. TimeZoneどうなっている?

GNU date コマンドは TZ を考慮。
意識せず使用していたが、認識を改めねば。

$ date --iso-8601=seconds -d '1970/01/01 00:00:00' 
1970-01-01T00:00:00+09:00

$ TZ='Asia/Tokyo' date --iso-8601=seconds -d '1970/01/01 00:00:00' 
1970-01-01T00:00:00+09:00

$ TZ='America/Los_Angeles' date --iso-8601=seconds -d '1970/01/01 00:00:00'
1970-01-01T00:00:00-08:00

指定された値は、TZ 自動判定。

3-2. UnixTime を求める時は?

では、UnixTime表示の +%s オプションは?

$ date +%s -d '1970/01/01 00:00:00'               
-32400

$ TZ='Asia/Tokyo' date +%s -d '1970/01/01 00:00:00'
-32400

はい同じ。指定値は TZ を自動で判定。

いたずらして、値に TZ を追加すると?

$ TZ='Asia/Tokyo' date +%s -d '1970/01/01 00:00:00 UTC'
0

なるほど。指定値に TZ がなければ環境の TZ。指定値に TZ をつけると確實。

ここで -u オプション使うと?

$ date -u +%s -d '1970/01/01 00:00:00'                               
0

指定値が UTC 扱いになった。

■他に試す:

$ TZ='UTC' date +%s -d '1970/01/01 00:00:00'
0

$ date +%s -d '1970/01/01 00:00:00 UTC'
0

$ date -u +%s -d '1970/01/01 00:00:00 +0900'
-32400

-u オプションでも指定値に TZ をあたえる時は注意。-uよりも指定したTZが強いようだ。

3-3. UnixTime を時刻表示にする時は?

date コマンドの --date or -d オプションに、@値 を指定すると、UnixTime を指定したことになる。

$ date --iso-8601=seconds -d @-32400
1970-01-01T00:00:00+09:00

@値 をUTCとして扱っている。
表示はTimeZone考慮。面倒。

$ date -u --iso-8601=seconds -d @-32400
1969-12-31T15:00:00+00:00

「UnixTime<->時刻」計算の時は、注意しないとね。


(4).Google SpreadSheet, LibreOffice

Google SpreadSheet 上で日付を整數にしてみると......

A B B結果
1 1900/01/01 =DATEVALUE(A1) 2
2 1899/12/30 =DATEVALUE(A2) 0

何だこれは?
どこからこのような基準が.........。

要注意。

LibreOfficeは基準日設定可能。

LibreOffice calc opt

しかし誰だろうね。この中途半端な日を基準にした人は。またその理由は何でしょう?


(5).Swift NSDate

Swift で Date ⇒ NSDate に變更。
NSDate の値を sqlite の TIMESTAMP 型に書き出すと整數値。
この整數値は基準日からの秒數。
2001/01/01 00:00:00 が基準。

要注意


(6).まとめ

1970/01/01 00:00:00との差:

基準にしている日時 days seconds
Google Spread 1899/12/30 00:00:00 -25569 -2209161600
GNU date 1970/01/01 00:00:00 0 0
Swift NSDate 2001/01/01 00:00:00 11323 978307200
$ date +%s -d '1899/12/30 00:00:00 UTC'   
-2209161600
$ date +%s -d '2001/01/01 00:00:00 UTC'
978307200

(7).感想

ややこしい。


以上


my 記事

@他の記事

Discussion