日付 - 1901年以前の年は無効と見なされます。

日付 - 1901年以前の年は無効と見なされます。

私のシステムに日付(GNU coreutils)7.1がインストールされています。

1901年12月14日より前の日付を確認しようとすると、「無効な日付」エラーが発生します。例えば、

  $ date -d 1901-12-13
  date: invalid date `1901-12-13'

  $ date -d 1901-12-14
  Sat Dec 14 00:00:00 EST 1901

dateユーティリティが1901年以前の年を有効なものとして扱うようにするにはどうすればよいですか?

2038年1月19日以降の日付についても同様のエラーが発生します。

答え1

良い質問。

これ文書許されるべきだと言いました。

 info date 'Date input formats' 'Calendar date items'

数値月の場合、ISO 8601 形式「YEAR-MONTH-DAY」が許可されます。ここでYEARは正数です。

数字が10未満の場合は、前に0が必要です。

YEARが68以下の場合は2000を追加し、YEARが100未満の場合は1900を追加します。

32ビットシステムをお使いですか?

2038-01-20以降の日付でもエラーは発生しますか?

date -d '2038-01-20'

その場合、GNU Dateは32ビット時間値を使用しているようです。

たとえば、64ビットシステムを使用したり他のツールを使用したりする以外に、この問題を解決する方法がわかりません。日時パールまたは日時Pythonで。

いくつかの背景:

Unix時間は整数値を使用して、1970年1月1日以降の秒数を計算します。システムが32ビット整数を使用している場合は、21億秒(2038-01-19 03:14:02 UTCベース)と21億秒(1901-12-13 20:45:52に戻る)のみを計算できます。 )UTC)。

詳しくは以下をご覧ください。

答え2

あなたのシステム(または少なくともこのバージョンの日付)は32ビットの内部時間値を使用できます。

Unix時代(時間値0)は1970-01-01 00:00:00 UTCです。この始点は、1901-12-13 00:00 ESTを符号付き32ビット時間値の範囲外にします。

1901-12-14 00:00:00 ESTは-2147454000
1901-12-13 15:45:52 ESTは-2147483648(C言語とも呼ばれINT_MIN、最小32ビット符号付き整数)
1901-02 00 アメリカ東部の時間は-2147540400です。

1901-12-13 15:45:52 ESTを試してみてください。動作するはずですが、1901-12-13 00:00のように1秒早く失敗することがあります。

関連情報