古い CentOS の date コマンド ハマった

某所の CentOS 4 で unixtime を shell で使う機会があったんですが、 僕の知ってる unixtime じゃないのを返してくる事象が起きた...

Version

1
2
3
4
5
6
7
$ 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 ずれる…

1
2
$ date '+%s' --date '2020-09-01T00:00:00'
1598918400 #<= 2020-09-01 02:00:00

:thinking_face:

原因

ISO8601 形式のパースに失敗するらしい

社内 Chat でぼやいてみたんですが、 debug が始まり結果下記のチケットを発見しました。

まさしく事象と同じことが書いてあった。

以下引用


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
以下の
(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 がえられる。 半日溶けました…

1
2
$ date '+%s' --date '2020-09-01 00:00:00'
1598886000
最終更新 2024-04-29 00:44 +0900
Built with Hugo
テーマ StackJimmy によって設計されています。