date (GNU coreutils) 8.22
特定の日付以降の日付の計算に問題があります。
たとえば、2月1日を使用したいとします。
$ date -d'1 February'
Sun Feb 1 00:00:00 CET 2015
その後、日付に週を追加したいと思います。これまではそのように良かった:
$ date -d '1 February + 1 week'
Thu Feb 8 00:00:00 LMT 0001
しかし、最初の項目として何かを追加すると1ではない、失敗し、誤ったコンテンツを返します。
$ date -d '1 February + 2 weeks' # returns as if it was +1 week
Fri Feb 8 00:00:00 LMT 0002 # but Fri instead of Thu, also LMT 0002
ただし、前にパラメータを追加すると機能します。
$ date -d '1 February + 0 minutes + 2 week' # works since we added 0/1 unit before
Tue Feb 15 00:01:00 LMT 0000
$ date -d '1 February + 1 minute + 1 day + 1 week' # works fine
Fri Feb 9 00:01:00 LMT 0001
$ date -d '1 February + 1 minute + 25 day + 7 week' # works since 1st parameter is 1!
Mon Apr 16 00:01:00 LMT 0001
相対日付を指定した場合、これは発生しません。
$ date -d 'today + 1 week'
Wed Jul 1 12:20:03 CEST 2015
$ date -d 'today + 2 week' # works fine
Wed Jul 8 12:20:12 CEST 2015
date
それでは、最初のパラメータが常に1で、日付が特定の日付に付属していると奇妙なことが発生すると見なされるのはなぜですか?
答え1
さて、私はいくつかの調査をしてみたので、最初の数字は年として解釈されました。これは+
完全に表面的で完全に無視されているようです。
あなたの例を使用してください。
$ date -d'1 February'
Sun Feb 1 00:00:00 CET 2015
年は提供されていないので、期待どおりに正しく動作します。
$ date -d '1 February + 1 week'
Thu Feb 8 00:00:00 LMT 0001
ほぼ正確に見えますが、年が無視された0001
ため、年が次のように変更されたことがわかります+
。したがって、コマンドは次のように処理されます。
{1 February 1} {+ 1}{week}
date
{+1}は、その日付以降のすべての期間のデフォルト値に見えます。
他の例はうまくいくようですが、うまくいきません。
$ date -d '1 February + 1 minute + 25 day + 7 week' # works since 1st parameter is 1!
Mon Apr 16 00:01:00 LMT 0001
ご覧のとおり、年は0001に増えました。分はすでに引用されているため、デフォルト値の1だけ増加します。その後、他のすべてのコマンドは日付の一部ではなく、それに応じて増加します。
この方法が機能するという追加の証拠として実際に機能するこの例を見てください。
$date -d '1 February 4 5 weeks'
Sun Mar 7 00:00:00 LMT 0004
動作原理と同じ
$date -d '1 February + 4 + 5 weeks'
Sun Mar 7 00:00:00 LMT 0004
つまり、以前に年が指定されていない場合、+は無視され、その後の最初の数字は年として扱われます。
明らかに減算したい場合は明示的に話す必要がありますが、最初の数字に年を指定しない限り無視されます。
$date -d '1 February -4 weeks'
Sun Feb 8 00:00:00 LMT 0004
^
Year incremented by 4.
マニュアルページで指定された形式で使用する場合、つまり
$date -d ' Feb 2 -4 weeks'
Mon Jan 5 00:00:00 GMT 2015
これにより、年なしで期待どおりに正しく動作します。 :)
答え2
2番目の数字を年として解釈してから1週間を仮定するようです。したがって、常に1年を追加してください。this year
そうすれば欲しいものを得ることができると思うからです。例えば。
christian@fujiu1404:~$ date -u -d'1 feb this year -2 weeks'
Sun Jan 18 00:00:00 UTC 2015
christian@fujiu1404:~$ date -u -d'1 feb this year +2 weeks'
Sun Feb 15 00:00:00 UTC 2015
christian@fujiu1404:~$ date -u -d'1 feb this year +3 weeks'
Sun Feb 22 00:00:00 UTC 2015