coreutil の date はどのようにしてこのような奇妙な結果を得るのでしょうか?

coreutil の date はどのようにしてこのような奇妙な結果を得るのでしょうか?

date私は「2 時間」などの表現を 7200 などの秒数に変換しようと試みていました。次のような呼び出しでこれを実行できると思いました。

date -d "1970-01-01 00:00:00 + 2 hours" +"%s"

しかし、そうしているうちに、非常に奇妙な結果に気づきました。(私のには/etc/timezone「Europe/Paris」が含まれているため、TZUTC 時間を強制するために を使用しています。)

omega:~$ TZ=utc date -d "1970-01-01 00:00:00" +"%s"             
0
omega:~$ TZ=utc date -d "1970-01-01 00:00:00 + 0 minutes" +"%s"
60
omega:~$ TZ=utc date -d "1970-01-01 00:00:00 + -1 minutes" +"%s" 
3660
omega:~$ TZ=utc date -d "1970-01-01 00:00:00 + 1 minutes" +"%s" 
-3540

date最初の結果は十分妥当ですが、最後の 3 つの結果がどのようにして導き出されたのか、まったく理解できません。これらの結果の論理を理解できる人はいますか?

答え1

+ xタイムゾーン指定子としてyour が使用されていると思います(たとえば、2013-04-25 19:52:36 +4は UTC より 4 時間進んだタイムゾーンの有効なタイムスタンプであると考えてください)。

次に、「minutes」という単語を見つけて、これを minute の同義語として扱い、1 分後の時間を表示します。

明示的なタイムゾーン指定子を入力すると、次のように動作します。

anthony@Zia:~$ TZ=utc date -d "1970-01-01 00:00:00 UTC" +"%s"   
0
anthony@Zia:~$ TZ=utc date -d "1970-01-01 00:00:00 UTC + 0 minutes" +"%s"
0
anthony@Zia:~$ TZ=utc date -d "1970-01-01 00:00:00 UTC + -1 minutes" +"%s" 
-60
anthony@Zia:~$ TZ=utc date -d "1970-01-01 00:00:00 UTC + 1 minutes" +"%s" 
60

秒の後のフィールドに注意してくださいUTC。秒を入力することもできます+0

anthony@Zia:~$ TZ=utc date -d "1970-01-01 00:00:00 +0 + -1 minutes" +"%s"
-60

...しかし、少なくとも個人的には、それは読むのがはるかに困難です。

または、秒の後に を置くこともできます。上記の例では、環境変数を UTC に設定するZ必要はありません。TZ

関連情報