古い CentOS の date コマンドハマった
某所の CentOS 4 で unixtime を shell で使う機会があったんですが、僕の知ってる unixtime じゃないのを返してくる事象が起きた...
version
$ date --version
date (coreutils) 5.2.1
Written by David MacKenzie.
Copyright (C) 2004 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
事象
ISO8601 の形式で --date
を書くと 7200 second ずれる...
$ date '+%s' --date '2020-09-01T00:00:00'
1598918400 #<= 2020-09-01 02:00:00
:thinking_face:
原因
ISO8601 形式のパースに失敗するらしい
社内Chatでぼやいてみたんですが、debugが始まり結果下記のチケットを発見しました。
GNU Core Utilities - Bugs: bug #11290, "date" cannot parse its... [Savannah]
まさしく事象と同じことが書いてあった。
以下引用
以下の
(1)に示すように、日付は有効なISO8601出力を生成できます。ただし、
(2)に示すように、その出力を解析することはできません。さらに悪いことに、
(3)に示すように、タイムゾーン情報が削除されると、dateは「T」セパレータを非標準で文書化されていない互換性のないタイムゾーン仕様として解釈します。
(4)に示すように、出力を適切に解析するには、「T」をスペースに置き換える必要があります。そのため、現在の日付の動作は、構成および状態テキストファイルでのISO8601形式の日付の使用を妨げています。
(0)$ date --version
date (coreutils) 5.2.1
(1)$ date -Iseconds
2004-12-10T13:27:59+0100
(2)$ date -d "2004-12-10T13:27:59+0100"
date: invalid date `2004-12-10T13:27:59+0100'
(3)$ date -d "2004-12-10T13:27:59"
Fri Dec 10 07:27:59 CET 2004
(4)$ date -d "2004-12-10 13:27:59"
Fri Dec 10 13:27:59 CET 2004
引用ここまで、
なので、 ISO8601 で書かず '2020-09-01 00:00:00'
と書けば目的の unixtime がえられる。
半日溶けました...
$ date '+%s' --date '2020-09-01 00:00:00'
1598886000