web-dev-qa-db-ja.com

1日は常に86,400エポック秒ですか?

私の過去の回答を確認していると、 this などのコードを提案していることに気付きました。

import time

def dates_between(start, end):
  # muck around between the 9k+ time representation systems in Python
  # now start and end are seconds since Epoch

  # return [start, start + 86400, start + 86400*2, ...]
  return range(start, end + 1, 86400)

このコードを読み直すと、私の背骨に Tony the Pony の恐ろしい感触を感じざるを得なくなり、耳や他のそのようなひどい、ひどいものに "うるう秒"を優しくつぶやきました。

エポックの「秒」の定義では、「1日は86,400秒の長さ」という仮定はいつ破られますか。 (私はPythonのような関数を想定しています time.mktime DSTで調整された値がすでに返されているため、上記のスニペットはDSTの切り替え日でも機能するはずです...)

40
badp

カレンディカルな計算を行うときは常に、Pythonの datetime および calendar モジュールなどのプラットフォームが提供するAPI、または成熟した高品質ライブラリを使用する方が、自分で「より単純な」コードを書くことです。日付とカレンダーのAPIは醜くて複雑ですが、それは実際のカレンダーには奇妙な動作がたくさんあるためです。

たとえば、現在「10:00:00 AM」である場合、「10:00:00 AM tomorrow」までの秒数は、使用しているタイムゾーンに応じて、いくつか異なる場合があります。 DSTが今夜開始するか終了するかなど。

定数86400がコードに表示される場合は常に、正しくないことを行っている可能性が高くなります。

また、週、月、年、四半期などの秒数を決定する必要がある場合、状況はさらに複雑になります。これらのカレンダーライブラリの使用方法を学びます。

22

Wikipedia によると、

UTCの日数はほとんどの場合86 400秒ですが、「うるう秒」により、86 401秒になることもあり、86 399秒になる場合もあります(後者のオプションは2010年12月の時点では使用されていません)。これにより、日が地球の回転(または世界時)と同期されます。

ダブルリープセカンドが実際に使用された場合、実際には86402が長くなる可能性があります。

再度編集:混乱を招くため、2番目に推測したpythonドキュメント。time.mktimeは常にUTCエポック秒を返します。ありました。 :)

12
Dave

1日の秒数は、使用する時間システムに依存します(例: POSIXでは、定義により1日は正確に86400秒です

エポック以降の秒数で表されているように、毎日、正確に86400秒で占められます。

UTCでは、うるう秒が含まれる可能性があります。つまり、1日は86401 SI秒(理論的には86399 SI秒)になる可能性があります。 2015年6月30日の時点で、26回発生しています

太陽の見かけの動きで日数を測定する場合、 (太陽)日の長さは、年間を通じて平均値から約16分異なります

次に、地球の回転(平均太陽時間)にも基づいている T1 とは異なります。 見かけの太陽の日は、平均の太陽の日よりも20秒短い、または30秒長い場合があります 。 UTCは、時々のうるう秒の導入により、UT1の0.9秒以内に維持されます。

ローカルクロックで1日を定義すると、奇妙な政治的タイムゾーンの変更が原因で非常に混乱する可能性があります。 DSTが原因で1日が1時間だけ変わる可能性があると想定することは正しくありません。

10
jfs

「サポート」 夏時間 のすべてのタイムゾーンで、24時間のない年に2日を取得します。彼らはそれぞれ25時間または23時間になります。そして、それらの日付をハードコーディングすることさえ考えないでください。それらは毎年、タイムゾーン間で変更されます。

ああ、これがあなたが考えていなかった 34のその他の理由のリストであり、なぜあなたがやっていることをやるべきではないのか です。

6
Lukas Eder