日付 - 115年以上前に戻るか、5879565年後の未来に行くことはできません。

日付 - 115年以上前に戻るか、5879565年後の未来に行くことはできません。
  • タイムゾーン= CEST
  • 日付(GNU coreutils)8.32
date -d "115 years ago"
Di 11. Aug 13:37:54 CET 1908
date -d "116 years ago"
date: invalid date ‘116 years ago’

質問

  1. 115 years追加返品可能ですか?過去または5879565 years入力未来
  2. なぜこれが起こり、エラーが発生するのですか?この奇数はどこから来るのでしょうか?
  3. なぜdate -d "200 years ago 14 Mar "突然仕事ができるのでしょうか?

答え1

時間と日付を計算するほとんど互換性のある方法がたくさんあります。

「伝統的な」Unix時間は、1970年(「エポック」とも呼ばれる)以降の秒を計算します。一つある大きな問題32ビット表現では、2038年1月19日火曜日に整数オーバーフローが発生します()date -d "@$((0x7fffffff))"

より「現代的な」アプローチは、64ビットカウンタでナノ秒を計算することです。

GNU coreutils 'date' は日付解析を委任します。DateTime2.yの解析、これは2500行のバイソンコードです。動作は環境によって異なります。たとえば、coreutils 8.32では、CygwinとUbuntuの両方が同じソースでコンパイルされているにもかかわらず、さまざまな動作が発生します。また、coreutils 8.2264ビットCentOS7で実行されており、「20000000000年前」から「20000000000年前」までの日付を受け入れます。

とにかく - 実装によって異なりますdate

以下を追加するように編集されました。

Philip Coulingはいくつかの発見をしました。タイムゾーンを合わせるのは難しいです。

また必ずお読みくださいプログラマーの時間に関する誤解。時間は単純なトピックのように見えるかもしれませんが、正しい時間を確保するのは難しいかもしれません。

答え2

私はここの最小限115 years ago(1908)があなたのタイムゾーンによるものであると強く疑います。しかし、時間帯に言及しなかったので確信できません。

ほとんどのコンピュータシステムはUTCまたは指定された地理的時間帯に設定され、通常は都市を参照しますEurope/London。地理的時間帯は、政府が場所の時間帯を変更して要求できるようにします。データベース場所別のタイムゾーン~から特定の日付/時刻。これにより、日付/時刻が夏時間の変更とほとんどの政治的愚かさに影響を与える可能性があります。

したがって、最も可能性の高いシナリオは、タイムゾーンが1908年頃のタイムゾーンオフセットのみを記録することです。一方、UTC計算は、タイムゾーンデータベースがUTC(および1960年以前のUT [GMT])を参照時間として使用するため、無期限に戻ります。

タイムゾーンの概念は本当に驚くほど新しいものです。1840年。それ以前の時間帯の計算は厄介な推測に過ぎず、大陸移動の調整が含まれる可能性が高いです。


将来の5879565年の計算は体系的で、Unix時間(UTCのうるう秒を考慮せずに1970年1月1日GMT以降の秒数)に基づいています。

しかし、将来の計算を信頼することにも注意する必要があります。今から100年後、特定地域の時間帯がどうなるかはわかりません。そして、このコードは580万年の間、グリニッジと比較して膨大な動きを考慮していませんでした。

答え3

実際に使用している実装によって異なります。

私のバージョンにはそのような制限はありません。

$ date -d "120 years ago"
Wed 12 Aug 14:20:26 UTC 1903

$ date -d "5000 years ago"
Tue 12 Aug 14:21:26 UTC -2977

(もちろん、日付が早すぎるほど、使用されているテギョンカレンダーは少し考えなければなりません)

$ date -d "+9879566 years"
Sat 12 Aug 14:24:17 UTC 9881589

$ date -d "+1000000000 years"
Sat 12 Aug 14:23:39 UTC 1000002023

それは私が200万年にわたって上下に動くことを可能にします。

$ date -d "+2147483524 years"
Tue 12 Aug 14:29:19 UTC 2147485547

$ date -d "+2147483525 years"
date: invalid date '+2147483525 years'

(124年は2³1 = 2147483648より小さい)

$ date -d "2147483772 years ago"
date: invalid date '2147483772 years ago'

$ date -d "2147483771 years ago"
Thu 12 Aug 14:32:23 UTC -2147481748

(123年は2³1 = 2147483648より小さい)

struct tmつまり、最初に加算したり減算した年数を計算するときに a の tm_year (1900 から始まる) の 32 ビット符号付き値を内部的に使用することを意味します。

答え4

使用日 --version=8.32:-

date -d "116 years ago"提供日:無効な日付「116年前」

しかし、UTCでマークするように強制すると、date -ud "116 years ago"Tue 13 Aug 12:13:25 UTC 1907になります。

実際に: - date -ud "20240000 years ago"Sun 13 Aug 12:15:55 UTC -20237977 を生成します。

関連情報