🌞
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は基準日設定可能。
しかし誰だろうね。この中途半端な日を基準にした人は。またその理由は何でしょう?
(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).感想
ややこしい。
以上
Discussion