naa0yama's Blog

naa0yama's Blog

古い 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
 
Share this