Unix時間/公式時間はどこで測定されますか?[閉まっている]


20

免責事項:

StackExchangeサイトのリストを約20分間調べて、どこに投稿すればよいかを考えました。より適切なサイトを知っている場合は、この質問をそこに移動してください。Unixの時間が考えさせられたので、私はこれをここに投稿しています。


だから、みんなが知っているように、Unix時間とUTCがあります。Unixの時間は刻々と過ぎ、秒を1秒あたり1秒とカウントしますが、UTCは地球の自転に合わせて、人間が読める形式で時間を維持しようとします。これを行うために、UTCは時々うるう秒を挿入します。

時間は、時間を経験しているオブジェクトが受ける重力、他の種類の加速度、および相対速度に関連するため、2つの質問につながります。最初に簡単なものを乗り越えましょう:UNIX時間はどこで測定されますか?アリスとボブが同じ場所にいるときに現在の時刻が1467932496.42732894722748であることに同意し始めた場合(もちろん、セシウム133の2つのエネルギーレベル間の遷移に対応する放射の9'192'631'770サイクルとして定義されている秒安静時および0 Kでの原子)、アリスが海面に住み、ボブが山中に住んでいる、またはアリスが北極に住んでおり、ボブが赤道に住んでいるため、双子のパラドックスを経験すると、彼らはもう同意しません。それでは、Unix時間はどのように正確に定義されますか?

地球が軌道を完成したときに誰もが確かに同意できるため、最初はUTCで問題が表示されないかもしれません(これはもちろん大陸プレートの動きを無視しますが、GPSを使用すると動きを測定することができるため、それはかなりよく理解できたと思います非常に正確に、それらがモデル上で設定された位置にあり、大陸プレートが移動しても移動しないと想定できます)、山、海面、赤道、または北極にあるかどうかにかかわらず。時間差はあるかもしれませんが、累積しません。

しかし、1秒は、静止時と0 Kでのセシウム133原子の2つのエネルギーレベル間の遷移に対応する放射の9'192'631'770サイクルとして定義され、セシウム133原子は地球の軌道を気にしません。UTCはどこうるう秒を挿入することを決定したが、地球の軌道の位相と測定された時間の間に測定または予測シフトが存在しなければならないので、どこかの原子時計による。どこにあるの?


5
「Unix時間は刻々と過ぎ、秒を数えます– 1秒あたり1秒」—実際、そうではありません。もしそうなら、物事はより簡単になります。
ホッブズ

3
あなたが尋ねたいと思う質問は、物理学のトピックにあったと思います-しかし、それはUTCのような時間標準に関する質問であり、UNIX時間とは何の関係もありません。これこれおよび他の関連する質問も参照してください。
デビッドZ

7
この質問は、Unixではなく、物理学、政治学、および時間的標準に関するものであるため、このトピックをオフトピックとして終了することに投票しています。
マイケルホーマー

3
あり、おそらくあなたが求めていることができることを、この分野でのトピックの質問どこかは、私はこれはそれではないと思います。「...そして、Unixはどうですか?」答えが示すように、時々無関係な質問に投げ込まれました。
マイケルホーマー

回答:


30

あなたの見出しの質問には本当の答えがありません。Unix時間は実際のタイムスケールではなく、どこでも「測定」されません。UTCには表現できない瞬間があるため、それは貧弱なものですが、UTCの表現です。Unixの時間は毎日86,400秒あると主張していますが、UTCはうるう秒のためにそれから逸脱しています。

より広範な質問については、4つの重要なタイムスケールがあります。

  1. UT1(世界時)。固定星に対する地球の自転を測定する世界中の天文台によって計算されます。これらの観察と少しの計算により、グリニッジの王立天文台での正午の瞬間に基づいた、より近代的な旧グリニッジ標準時を取得します。世界時はIERS(International Earth Rotation and Reference Systems Service、旧International Earth Rotation Service)と呼ばれる組織によって計算されます。

  2. TAI(International Atomic Time)は、世界中の数百の原子時計によって管理され、国家標準化機関などによって維持されています。TAIに貢献する時計のキーパーは、時間転送技術を使用して互いの時計を制御し、個々の時計の小さなエラーをキャンセルし、アンサンブル時間を作成します。そのアンサンブルはTAIであり、SIの単位システムのスチュワードである国際計量局(BIPM)によって公開されています。時間膨張に関する質問に答えるために、TAIは海面での原子時間(実際には、同じアイデアのより洗練されたバージョンであるジオイド)であると定義され、各クロックは独自の高度の影響を補正します。

  3. UTC(協定世界時)。UTCは1972年1月1日にTAIから10秒遅れて設定され、その日付以降、うるう秒が加算または減算される場合を除き、TAIとまったく同じ速度で進みます。IERSは、差を0.9秒以内に保つためにうるう秒を発表することを決定します(実際には、約0.6秒以内に、うるう秒を追加すると、差が-0.6から+0.4になります)。理論上、うるう秒は正負両方の可能性がありますが、地球の自転はSIとTAIによって確立された標準に比べて低下しているため、負のうるう秒は決して必要ではなく、おそらく決して必要ありません。

  4. Unix時間。UTCを単一の数値として表すために最善を尽くします。86,400の倍数であるすべてのUnix時間は、UTCの真夜中に対応します。すべてのUTC日が86,400秒の長さではなく、すべての「Unix日」の長さであるため、何らかの形でパッチを適用する必要のある矛盾した相違点があります。うるう秒の追加に対応するUnix時間はありません。実際には、システムは前の秒が2回発生したかのように動作し(Unixタイムスタンプが1秒後方にジャンプしてから先に進みます)、またはどちらかの側で長時間ワープするリープスミアリングのような手法を適用しますうるう秒。いずれの場合も、少なくとも2番目の要素は単調ですが、多少の不正確さがあります。両方の場合において、そしてBは、BAに等しくありません。これは、ba に介在するうるう秒の数を足したものに等しくなります。

UT1、TAI、UTC、およびIERSはすべて世界的で多国籍の取り組みであるため、単一の「場所」はありませんが、IES速報はパリ天文台から発行され、BIPMもパリに拠点を置いています。正確で追跡可能な時間を必要とする組織は、タイムベースを「UTC(USNO)」のように記述します。つまり、タイムスタンプはUTCであり、米国海軍天文台の時間から派生しますが、私はUnix時間について言及しましたが、基本的にそのレベルの精度とは互換性がありません。本当に正確な時間を扱う人は、Unix時間に代わるものがあります。


1
right/Olsonシステムのタイムゾーンの存在と、それらがどのように見なされるかを見落としていtime_tます。
JdeBP

1
@JdeBP私は実際にそれを聞いていませんでした。UnixがPOSIXと長年の慣習の両方に明らかに反するとき、そのUnix時間と呼ぶのは少し疑わしいと思いますが、とにかく貴重な情報です。おそらくあなたはそれについての答えを追加できますか?
ホッブズ

1
一般的な人にとって非常に正確な時間ソースを取得する最も簡単な方法は、GPS受信機です。衛星のクロックはTAIと同期しており、信号は約10秒まで正確です(補正なし。補正を行うと10-1に改善できます)。
ヤンHudec

1
@JanHudecそれは普通の人が10⁻²または10⁻¹⁰までの正確な時計の違いを見分けることができるようではありません。
gerrit

1
UNIXにうるう秒のサポートが含まれていない理由のヒント。これは、Austin Groupの電話会議で何度も議論されており、その結果、うるう秒のサポートを追加すると、サポートを省略するよりも多くの問題が発生します。
気味悪い

12

クロックの調整はIERSによって調整されます。必要に応じて、タイムストリームへのうるう秒の挿入をスケジュールします。

以下からのNTPタイムスケールとうるう秒

パリ天文台の国際地球回転サービス(IERS)は、USNOおよび他の観測所が提供する天体観測を使用して、地球の回転の不規則な変動に対して補正されたUT1(ナビゲーター)タイムスケールを決定します。

私の知る限り、23:59:60(うるう秒)と翌日の00:00:00は、Unix時間では同じ秒と見なされます。


8

UNIX時間は、UNIXを実行しているコンピューターで測定されます。

この答えは、世界標準時(UTC)、国際原子時(TAI)、およびSI秒が何であるかを知っていることを期待します。それらの説明は、UnixおよびLinux Stack Exchangeの範囲をはるかに超えています。 これは物理学または天文学スタック交換ではありません

ハードウェア

コンピューターには、クロックとタイマーを駆動するさまざまな発振器が含まれています。正確には、アーキテクチャによってコンピューターごとに異なります。しかし、通常、そして非常に一般的な用語で:

  • プログラム可能なインターバルタイマー(PIT)がどこかにあります。これは、指定された数の発振をカウントし、中央処理装置への割り込みをトリガーするようにプログラムできます。
  • 中央処理装置には、実行される命令サイクルごとに1を単純にカウントするサイクルカウンターがあります。

非常に広い意味での動作理論

オペレーティングシステムカーネルは、PITを使用してティックを生成します。PITをフリーランに設定し、たとえば100分の1秒の時間間隔で適切な振動数をカウントし、割り込みを生成してから、カウントを自動的にリセットして再び実行します。これにはさまざまなバリエーションがありますが、本質的には、これによりティック割り込みが固定周波数で発生します。

ソフトウェアでは、カーネルはティックごとにカウンターをインクリメントします。そもそもPITをプログラムしたため、ティック周波数を知っています。したがって、1秒を構成するティックの数がわかります。これを使用して、秒をカウントするカウンターをいつインクリメントするかを知ることができます。後者は、カーネルの「UNIX Time」の考え方です。実際、独自のデバイスに任せた場合は、SI秒あたり1の割合で単純にカウントアップします。

これを複雑にしているのは4つのことで、これを非常に一般的な用語で説明します。

ハードウェアは完璧ではありません。Nヘルツの発振器周波数を持っているとデータシートに記載されているPITは、代わりに(たとえば)N .00002ヘルツの周波数を持っているかもしれませんが、明らかな結果があります。

このスキームは、CPUが1秒間に数百回目を覚まして変数の数値を増やすだけなので、電力管理との相互運用性は非常に低くなります。そのため、一部のオペレーティングシステムには、「ティックレス」設計と呼ばれるものがあります。PITがすべてのティックに対して割り込みを送信する代わりに、カーネルは(低レベルスケジューラから)スレッドクォンタムを実行せずに何ティックが通過するかを計算し、その多数のティックをカウントするようにPITをプログラムしますティック割り込みを発行する前の未来。次に、1ティックではなく、次のティック割り込みでNティックの経過を記録する必要があることを知っています。

アプリケーションソフトウェアには、カーネルの現在時刻を変更する機能があります。値をステップすることも、値をスルーすることもできます。回転には、秒カウンタをインクリメントするために通過する必要があるティックの数の調整が含まれます。そのため、秒カウンタは、とにかく SIごとに1つのレートでカウントする必要はありません。完璧なオシレーターを想定していてもです。ステッピングには、単に秒カウンターに新しい数値を書き込むだけです。これは通常、最後の秒が刻まれてから1 SI秒が経過するまで発生しません。

最新のカーネルは、秒をカウントするだけでなく、ナノ秒もカウントします。しかし、1ナノ秒ごとに1回のティック割り込みを行うことはばかげており、しばしば完全に実行不可能です。これは、サイクルカウンターなどが作用する場所です。カーネルは、毎秒(または各ティック)でサイクルカウンター値を記憶し、ナノ秒単位で時間を知りたいときにカウンターの現在の値から、最後の秒から経過したナノ秒数(またはティック)。繰り返しになりますが、命令サイクルの頻度が変化する可能性があるため、電力と熱の管理はこれで大混乱に陥ります。そのため、カーネルは(たとえば)高精度イベントタイマー(HPET)などの追加ハードウェアに依存するなどのことを行います。

C言語とPOSIX

C言語の標準ライブラリは、不透明タイプの点で時間を記述しtime_t、構造型tmの様々な指定されたフィールドを持つ、など様々なライブラリ関数time()mktime()、およびlocaltime()

簡単に言うと、C言語自体time_tは、それが利用可能な数値データ型の1つであり、時間差を計算する唯一の信頼できる方法がdifftime()関数であることを保証するだけです。time_t実際には整数型の1つであり、エポック以降の秒数をカウントするという厳密な保証を提供するのはPOSIX標準です。また、timespec構造タイプを指定するPOSIX標準でもあります。

このtime()関数は、システムコールと呼ばれることもあります。実際、今日では多くのシステムの基になるシステムコールではありませんでした。たとえば、FreeBSDでは、基になるシステムコールはclock_gettime()であり、さまざまな方法で秒または秒+ナノ秒で測定するさまざまな「クロック」を使用できます。アプリケーションソフトウェアがカーネルからUNIX Timeを読み取るのは、このシステムコールです。(一致するclock_settime()システムコールによりステップ実行adjtime()でき、システムコールによりスルーできます。)

多くの人々は、POSIX標準が規定するものについて非常に明確で正確な主張をして、POSIX標準を振り回しています。そのような人々は、多くの場合、実際にPOSIX標準を読んでいません。その理論的根拠が示すように、「エポックからの秒数」をカウントするという考え方は、標準が使用するフレーズであり、POSIX秒がSI秒と同じ長さであることも、結果が「必然的に」であることも意図的に指定していませんgmtime()UTC、その外観にもかかわらず」。POSIX標準は意図的に(たとえば)管理者が行って、うるう秒調整が発生した週にクロックを再設定することにより、うるう秒調整を手動で修正するUNIXシステムを可能にするほど十分に緩い。実際、理論的根拠は、クロック現在のUTC時間以外の時間に意図的に誤っ設定されているシステムに対応するために意図的に十分に緩いことを指摘しています。

UTCおよびTAI

カーネルから取得したUNIX Timeの解釈は、アプリケーションで実行されるライブラリルーチンに依存します。POSIXは、カーネルの時間との「壊れた時間」の間のIDを指定しますstruct tm。しかし、Daniel J. 「違反よりも名誉を守ること」は、すぐに思い浮かぶフレーズです。

そして確かにそうです。現在、いくつかのシステムは、この解釈をArthur David Olsonによって書かれたライブラリルーチンに基づいています。このルーチンは、悪名高い「Olsonタイムゾーンデータベース」を参照します/usr/share/zoneinfo/。Olsonシステムには2つのモードがありました。

  • カーネルの「エポックからの秒数」は、うるう秒を除き、1970-01-01 00:00:00 UTC以降のUTC秒をカウントすると見なされます。これは、posix/Olsonタイムゾーンデータベースファイルのセットを使用します。すべての日には86400カーネル秒があり、1分に61秒はありませんが、SI秒の長さであるとは限りません。また、うるう秒の発生時にカーネルクロックを回転またはステップ移動する必要があります。
  • カーネルの「エポックからの秒数」は、1970-01-01 00:00:10 TAI以降のTAI秒をカウントすると見なされます。これは、right/Olsonタイムゾーンデータベースファイルのセットを使用します。カーネル秒は1 SI秒長であり、カーネルクロックはthe秒を調整するために旋回またはステップ移動する必要はありませんが、ブレークダウン時間は23:59:60などの値を持つことができ、日は常に86400カーネル秒の長さではありません。

M. Bernsteinは、1970-01-01 00:00:00 TAIからTAI秒を取得するために10を追加しただけdaemontoolsright/ので、ツールセットを含むいくつかのツールを作成しましたtime_t。彼はこれをマニュアルページに文書化した。

この要件は、(おそらく無意識のうちに)daemontools-encoreおよびなどのツールセットによって継承さrunitれ、Felix von Leitner'sによって継承されましたlibowfat。たとえば、Olson 構成でBernsteinmultilogGuentermultilog、またはPapesvlogdを使用するposix/と、すべてのTAI64Nタイムスタンプは(これを書いている時点で)1970-01-01 00:00:10以降の実際の TAI秒カウントより26秒遅れます。 TAI。

Laurent Bercotと私は、s6とnoshでこれに対処しましたが、異なるアプローチを採用しました。M. Bercot tai_from_sysclock()はコンパイル時フラグに依存しています。でTAI64Nルックで取引することを間食ツールTZTZDIRの環境変数を自動検出posix/し、right/それができれば。

興味深いことに、TAI秒としてOlson モードに相当するFreeBSDのドキュメントtime2posix()posix2time()機能。ただし、明らかに有効化されていません。right/time_t

もう一度…

UNIX時間は、UNIXを実行しているコンピューターで、コンピューターのハードウェアに含まれるオシレーターによって測定されます。SI秒は使用しません。表面的には似ているかもしれませんが、UTCではありません。そして、それはあなたの時計が間違っていることを意図的に許可します。

参考文献

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.