web-dev-qa-db-ja.com

Unix時間とうるう秒

Unix(POSIX)の時間について Wikipedia はこう言っています:

うるう秒の処理のため、時間の線形表現でも、UTCの真の表現でもありません。

しかし、Unix dateコマンドは実際にはそれらを認識していないようです

$ date -d '@867715199' --utc
Mon Jun 30 23:59:59 UTC 1997
$ date -d '@867715200' --utc
Tue Jul  1 00:00:00 UTC 1997

うるう秒があるはずですが、Mon Jun 30 23:59:60 UTC 1997

これは、うるう秒を無視するのはdateコマンドだけであり、Unix時間の概念は無視しないということですか?

35
Campa

1日あたりの秒数はfixednix timestamps で固定されています。

Unix時間数は、Unixエポックではゼロであり、エポック以降、1日あたり正確に86400増加します。

したがって、うるう秒を表すことはできません。 OSはこれに対応するためにクロックを遅くします。 Unixタイムスタンプに関する限り、うるう秒は存在しません。

29
Thomas Jung

Unixの時間は扱いが簡単ですが、タイムスタンプの一部は実時間ではなく、一部のタイムスタンプは一意の時間ではありません。

つまり、Unix時間では60秒が繰り返されなければならない場合があるため(61秒はあり得ないため)、タイムスタンプが2つ重複するタイムスタンプがいくつかあります。理論的には、スキップのうるう秒はまだ発行されていませんが、60秒が存在する必要がないため、将来的にギャップになる可能性もあります。

UNIX時間の根拠:簡単に操作できるように定義されています。うるう秒のサポートを標準ライブラリに追加するのは非常に困難です。たとえば、データベースで2050年1月1日を表すとします。地球上の誰もが、その日付がUTCで何秒離れているかを知りません。 IAUは次の10年間に追加する必要があるうるう秒数を知らないため、日付をUTCタイムスタンプとして保存することはできません(ランダムなものと同じです)。では、プログラマーは、将来の2つの日付の間で経過する時間の長さが1年か2年前までわからない場合、どのようにして日付の計算を行うことができるでしょうか。 Unixの時刻は単純です。2050年1月1日のタイムスタンプはすでにわかっています(つまり、80年* 1年の秒数)。 UTCは一年中使用するのが非常に困難ですが、UNIX時間はうるう秒が発生した瞬間にのみ使用するのが難しいです。

それに値することについては、うるう秒に同意するプログラマーに会ったことがありません。彼らは明らかに廃止されるべきです。

21
Nicholas Wilson

うるう秒については、ここや他の場所で多くの議論がありますが、UTC、GMT、UT1、TAI、またはその他の時間標準とは何の関係もないため、複雑な問題ではありません。 POSIX(Unix)時間は、定義により、IEEE Std 1003.1 "POSIX"標準 ここで利用可能 で指定されている時間です。

標準は明確です。POSIX時間にはうるう秒は含まれません。

協定世界時(UTC)にはうるう秒が含まれます。ただし、POSIX時間(エポックからの秒数)では、うるう秒は無視され(適用されません)、時間差を計算する簡単で互換性のある方法が提供されます。したがって、分解されたPOSIX時間は、その外観にもかかわらず、必ずしもUTCではありません。

特に、POSIX時間にはうるう秒が含まれないことを明記して、次のように重要な詳細を定めています。

適合実装が特定の公式クロックとの固定された関係を持たなければならないことを義務付けることは現実的に不可能です(分離されたシステム、またはクロックを任意の時間に設定して「再実行」を実行するシステムを検討してください)。

うるう秒は委員会によって決定されるため、うるう秒をPOSIX時間に含めることは単なる「悪い考え」ではなく、標準でネットワークアクセスのない適合実装が許可されていることを考えると不可能です。

この質問の他の箇所で、@ PacerierはPOSIX時間にはうるう秒が含まれていること、および各POSIX時間は複数のUTC時間に対応している可能性があると述べています。これは確かにPOSIXタイムスタンプの考えられる解釈の1つですが、これは決して標準で指定されているわけではありません。彼の議論の大部分は、POSIX時間を定義する標準に適用されないイタチ語にあります。

今、物事は複雑になります。標準で指定されているように、POSIX時間はUTC時間と同じではない場合があります。

したがって、分解されたPOSIX時間は、その外観にもかかわらず、必ずしもUTCではありません。

ただし、実際にはそうです。この問題を理解するには、時間基準を理解する必要があります。 GMTとUT1は、宇宙における地球の天文学的な位置に基づいています。 TAIは、物理的(原子的)反応によって測定される、宇宙を通過する実際の時間に基づいています。 TAIでは、各秒は「SI秒」であり、すべて同じ長さです。 UTCでは、各秒はSI秒ですが、必要に応じてうるう秒が追加され、GMT/UT1の0.9秒以内にクロックを再調整します。 GMTとUT1の時間基準はによって定義されます地球の位置と宇宙での動きの経験的測定。予測した。そのため、うるう秒も予測できません。

現在、POSIX標準では、さまざまな実装ですべてのPOSIXタイムスタンプを相互運用可能(つまり、同じこと)にすることを意図しています。 1つの解決策は、すべてのPOSIX秒が1 SI秒であることを全員が同意することです。この場合、POSIX時間はTAI(指定されたエポック)と同等であり、原子時計以外の誰かに連絡する必要はありません。ただし、POSIXタイムスタンプをUTCタイムスタンプにしたかったためと考えられます。

POSIX標準の見かけ上の抜け穴を使用して、実装は意図的に秒を遅くしたり、加速したりして、POSIX時間がSI秒を使用しないようにして、UTC時間との同期を維持します。標準を読むと、これは意図されたものではなかったことが明らかです。これは、分離されたシステムでは実行できないため、他のマシンと相互運用できないためです(うるう秒なしのタイムスタンプは、うるう秒がある他のマシンとは異なる意味を持ちます)。読んだ:

[...]エポック値は準拠システム全体で一貫しているため、時間の名前と秒の解釈が重要です。つまり、システムの現在の時刻の精度に関係なく、すべての準拠システムが「エポック以降の536457599秒」を59秒、59分、23時間として解釈することが重要です。式は、カレンダーを指定しようとするのではなく、一貫した解釈を確実にするために与えられます。 [...]この未指定の秒は、名目上、国際システム(SI)秒と同じです。

この動作を可能にする「抜け穴」:

これの実際的な結果として、外部標準によって測定された1秒の長さが指定されていないことに注意してください。

したがって、実装は、意図的に、分離されたシステムまたは非参加システム間で相互運用できないものに意図的に変更することにより、この自由を乱用します。あるいは、実装は、時間が経過していないかのように、単にPOSIX時間を繰り返す場合があります。すべての最新の実装の詳細については、 このUnix StackExchangeの回答 を参照してください。

ふー、それは混乱を招きました...本当の頭の体操!

5
user11658273

他の両方の答えには誤解を招く情報がたくさん含まれているので、これを投入します。

1日あたりのUnixエポックのタイムスタンプ秒数はfixedであるとThomasは正しい。これは、うるう秒が存在する日に、真夜中の直前の秒(真夜中の前のUTC分の61秒)には、前の秒と同じタイムスタンプが与えられることを意味します。

そのタイムスタンプは、可能であれば「リプレイ」されます。したがって、同じUNIXタイムスタンプが実際の2秒間使用されます。これは、Unixの画期的な割合を取得している場合、秒全体が繰り返されることも意味します。

X86399.0X86399.5X86400.0X86400.5X86400.0X86400.5、次にX86401.0

したがって、UNIX時間はうるう秒を表すことができません明確にうるう秒のタイムスタンプは、前の実世界の秒のタイムスタンプでもあります。

2
B T