8

PHPのマニュアルには、 「現在のUNIXタイムスタンプ」をtime()返すと記載されています そして、「マイクロ秒単位 の現在のUnixタイムスタンプ 」を返します。microtime()

ただし、これらの関数は、厳密に準拠したPOSIX.1システムの関数と同じように動作することが保証されていますか?

time() 具体的には、うるう秒は、 |の出力が次のように挿入されるようにしますか。翌日の開始時に1秒後方microtime()に ジャンプし(これはうるう秒の終わりでもあります) 、次の最初の1秒全体にわたって、新しい一意の値ではなく、繰り返しの戻り値を取得します。日?

たとえば、time() |をポーリングする場合 microtime()1998-12-31と1999-01-01の期間中、マイクロ秒ごとに、915 148 800 <= x <915 148 801の範囲内で各値が2回発生しますか?

4

3 に答える 3

13

PHPのtime()から取得するUNIXタイムスタンプは、独特の獣です。

これを理解するのに長い時間がかかりましたが、うるう秒の間にタイムスタンプが増加し、うるう秒が終了すると、タイムスタンプ(UTCではありません!)が1秒戻ります。

これにはいくつかの重要な意味があります。

  • UTCからUNIXタイムスタンプにいつでも正確に変換できます
  • タイムスタンプからUTCに常に(すべての時点で)変換できるとは限りません
  • Unixタイムスタンプは連続していません。つまり、後退します。(または、2秒間インクリメントせずに同じままです。)
  • UNIXタイムスタンプからUTCへの変換エラーが発生した場合、エラーは最大2秒遅れます。(これは、間違った日を取得する可能性があることを意味します。)
  • 振り返ってみると、Unixタイムスタンプは線形に見えます。これは、時系列データを保存していて、1年に1〜2秒が誤って表示されることを気にしない場合は、保存されたタイムスタンプ付きデータが連続していると見なすことができることを意味します。

回避策

Unixタイムスタンプが突然ジャンプバックしたり、2秒間同じままでなかったりした場合はどうなりますか?これはまさにGoogleが彼らのサーバーのために起こしたものです。彼らの解決策は、長い期間にわたって一度に数ミリ秒だけ時間をゆっくりと歪め、うるう秒をアプリケーションに事実上目に見えないようにシフトさせることでした。(Googleサーバー上のアプリケーションとオペレーティングシステムに関する限り、うるう秒はIERSによって挿入されなくなりました。)

于 2012-08-23T06:43:08.027 に答える
9

PHPはサーバーサイド言語です。time()関数は、そのサーバーのシステム時刻に解決されます。サーバーがNTPデーモンを実行している場合は、うるう秒を認識し、それに応じて調整します。PHPはこれを認識していませんが、システムは認識しています。

于 2011-10-15T20:42:32.013 に答える
1

time()UNIXタイムスタンプを返すだけです。これは、うるう秒などの影響を受けないことを意味します。誰かが決定したからといって、時間を「失う」ことは決してないからです。テキスト表現(たとえば、を使用して作成されたものdate())のみが影響を受けます。

于 2011-10-15T20:41:57.830 に答える