Unix 時刻、うるう秒、Unix 時刻を日付に変換

Unix 時刻、うるう秒、Unix 時刻を日付に変換

私はUnixの時間に関する多くの記事を読んでおり、多くの人が1日86,400秒だと言います。

しかし、ページは次のようになりますこれユンチョについて話してください。これは私を混乱させる。私はUnixの時間がUTCに基づいていることを読んで、私が理解しているのは、UTCとTAIの違いがうるう秒なので、Unixはうるう秒をサポートする必要があるということです。そうでなければ、UTCの代わりにTAIベースで言わないのはなぜですか?

もっと混乱させるためにWindowsがどのような機能をするのか確認してみたところ、見つけた答えはうるう秒を計算しないということでしたが、それは言うUTCに基づいており、混乱しています。うるう秒は計算されませんが、なぜUTCと言うのですか?

とにかく、Unixで整数秒を正しい日付に変換する方法を尋ねたいと思います。

ベストアンサー1

私はUnixの時間に関する多くの記事を読んでおり、多くの人が1日86,400秒だと言います。

はい、それは正義です。

しかし、このようなページでは、うるう秒について説明します。これは私を混乱させる。

あなたは唯一の人ではありません。本当に面白い混乱です。

Unixの時間はUTCに基づいていることを読んだ。

はい、下記をご覧ください。

私が理解できるのは、UTCとTAIの違いがうるう秒だということです。

はい。

もしそうなら、Unixは飛躍を支援しなければならない

しかし、実際にはそうではありません。目を閉じて、この厄介で非実用的な技術的な問題についての議論を聞くことを拒否します。

これPOSIX は「エポック以降の秒」を定義します。細分化されたUTC時間に基づいて、すべての日付の長さが86400秒であることを明示的に想定します。

エポック後4.15秒

エポックから経過した時間(秒)に近い値です。協定世界時[UTC]名前(秒単位で指定(tm_seconds)、分(最小時間)、時間(tm_時間)、今年1月1日以降の日数(tm_yday)、該当する年の場合、マイナス1900(tm_年))は、次の式に従ってエポック以降の時間(秒)に関連付けられます。

年が1970年未満の場合、または値が負の場合、関係は定義されません。年が1970より大きく、値が負でない場合、値はC言語式に従ってUTC名に関連付けられます。tm_seconds最小時間tm_時間tm_ydaytm_年すべて整数型です。

tm_sec + tm_min*60 + tm_hour*3600 + tm_yday*86400 +
    (tm_year-70)*31536000 + ((tm_year-69)/4)*86400 -
    ((tm_year-1)/100)*86400 + ((tm_year+299)/400)*86400

実際の時刻と新起源以降の現在時刻(秒)との関係は指定されません。

現在のリアルタイムと所望の関係を維持するために、エポック値の後の秒単位の変更方法は、実装に従って定義される。エポックの後の秒単位で表すと、1日は正確に86400秒と計算する必要があります。

(奇数処理tm_yearは、うるう日を考慮するためのものです。除算は切り捨てられた整数除算です。)

これ基本原理部分うるう秒が無視されることを直接認めます。

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


上記の式は、うるう秒が挿入されると、「エポック後の秒」が1秒間繰り返されることを意味します。

UTC 1972-06-30 23:59:59 = 78796799 seconds since epoch
UTC 1972-06-30 23:59:60 = 78796800 seconds since epoch
UTC 1972-07-01 00:00:00 = 78796800 seconds since epoch
UTC 1972-07-01 00:00:01 = 78796801 seconds since epoch

これは、エポックの後の「秒」が(物理的に)同じ長さではないか、またはエポック自体が実際に「移動」することを意味する。選んでみてください。

  • 上記のように、1秒は2(物理的、SI / UTC)秒であるため、明らかに同じ長さではありません。

  • 「すべての日は86400秒」という定義を取るとSI秒の長さが一定であると仮定し、これを計算するとエポックは次のように「移動」します。 (つまり、UTC 1972-07-01 00:00:00はUTC 1970-00-01 00:00:01以降78796800 SI秒なので、その時点で有効なエポックでなければなりません。)

まあ、彼らは「おおよそ」とヘッジします。

さらに、これは単純だが正確な解決策が存在しない状況の1つです。あなたは到着することができます良い点の3つのうち2つを選択してください。そして耐えなければならない

  • a) 可変長日数(秒)
  • b)それ自体が長さが異なる秒
  • c) 最終的に太陽と同期しなくなった日付システム。

日付の計算を簡素化するために、POSIXは(a)を拒否しますが、そうでなければ商業時と一致するようにUTCを一致させるので、(c)を拒否し、欠点(b)を許可することを選択します。計算の単純さは、理論的根拠で明示的に言及されています。

うるう秒を数秒単位で考慮する必要があるかどうかについてのトピックは、毎回合意を通じて(それぞれの意見の違いを認めながら)何度も議論されたことがあります。ほとんどのユーザーには、すべての日付を同じ取引で処理することをお勧めします。 。 (つまり、ほとんどの用途は、すべての日が単一の長さ(エポック以降の秒単位で測定)を持つと仮定すると判断されます。

(「実時間と新起源以降の現在の秒数との関係は指定されていません。」) ほとんどすべての実際の目的では、UTCが「実時間」であり、上記の定義に依存しているため、文自体は奇妙です。どうかはわかりませんが、システムクロックが正確である必要はなく、外部同期がないと、ほとんどのコンピュータクロックは正確ではないという意味に過ぎません。

同様に「したがって、POSIX時間が現れても必ずしもUTCではない」根拠部分が変に見えますが、うるう秒に当てはまります。そうでなければ、与えられた同等性はPOSIX時間を考慮したようです。はいUTC。 )


しかし、スマートな人がそれについて十分に書いているので、私は正しくすることを期待しないでください。


とにかく、Unixで整数秒を正しい日付に変換する方法を尋ねたいと思います。

何秒かによって..

Unix 時間では、86400 で割って日数を取得し、可変長月、うるう日、時間帯の一般的な規則に従います。

またはむしろ電話localtime()するか、gmtime()代わりにしてください。

それ以外の場合は、現在持っているものを処理できるライブラリを使用してください。

おすすめ記事