1. ホーム
  2. date

[解決済み] 時刻は常にUTCで保存するのが良いのでしょうか、それともローカルタイムで保存するのが良いのでしょうか?

2023-06-20 17:22:11

質問

一般に、時刻はUTCで保存するのがベストプラクティスです。 ここで および はこちら .

例えば終了時刻が、そのタイムゾーンの夏時間がオンかオフかに関係なく、常に同じ現地時間(例えば17:00)になるような、繰り返し発生するイベントがあるとします。また、特定のタイムゾーンで夏時間がオンまたはオフになったときに、手動で時刻を変更しないことが要求されています。また、API(GetEndTimeByEventなど)を通じて他のシステムから終了時刻を尋ねられると、常にUTCフォーマットで終了時刻を送信することが要件となっています。

アプローチ1: 決定された場合 をUTCに格納する で保存する場合、以下のようにデータベースのテーブルに保存することができます。

Event      UTCEndTime
=====================
ABC         07:00:00
MNO         06:00:00
PQR         04:00:00

最初のイベントABCの場合、UTCでの終了時刻は07:00ですが、2012年7月1日にUTCからローカルタイムに変換して表示すると、ローカルタイム17:00となり、2012年10月10日(タイムゾーンで夏時間がONの日)に変換すると、終了時刻18時となり、正しい時刻とは言えなくなります。

私が考えられる1つの方法は、DST時間を追加の列に保存し、タイムゾーンがDSTをONにしているときにその時間を使用することです。

アプローチ2。 しかし、もしそれが がローカル時間として保存されている場合 として保存された場合、例えばイベントABCではUTCから現地時間への変換が行われないため、どの日付でも常に17:00となります。

Event      LocalEndTime
=======================
ABC         17:00:00
MNO         16:00:00
PQR         14:00:00

そして、アプリケーション層はローカルタイムをUTCタイムに変換し、(API GetEndTimeByEvent)を通じて他のシステムに送信します。

この場合でも、UTCで時間を保存するのは良いアイデアでしょうか?もしそうなら、一定のローカル時刻を得るにはどうしたらよいでしょうか。

関連する質問 UTCでない時間を保存する正当な理由があることがありますか?

どのように解決するのですか?

その質問に答えるためには、タイムスタンプを保存するためにUTCを使うことの利点について考える必要があると思うのです。

個人的には、その主な利点は、時刻が常に(ほとんど)保証されていることだと思います。 一貫して . 言い換えれば、タイムゾーンが変更されたり、サマータイムが適用されたりするたびに、時間が前後することがないのです。これは、ファイルシステムやログなどでは特に有効です。しかし、それは 必要 は必要でしょうか?

2つのことを考えましょう。まず、DSTのクロックシフトの時間について。あなたのイベントは、(クロックシフトが行われる日の)午前2時から午前3時の間に発生しそうでしょうか?そのとき、何が起こるべきでしょうか?

第二に、アプリケーションは実際のタイムゾーンの変更の影響を受けるでしょうか。言い換えれば、ロンドンからワルシャワまでそれを持って飛び、コンピュータのタイムゾーンを適切に変更するつもりですか? その場合、どうなるのでしょうか。

もしあなたが いいえ と答えた場合、現地時間の方がよいでしょう。その方がアプリケーションをよりシンプルにすることができます。しかし、もしあなたが はい と答えたのなら、もっと考えてみるべきだと思います。


これはすべてデータベースに関することでした。もうひとつは、アプリケーションが内部で使用する時間形式です。

APIで時刻を公開するとおっしゃいました。アプリケーションはリクエストのたびにデータベースに問い合わせるのでしょうか。内部で時刻を UTC として保存する場合、それを行うか、または DST/タイムゾーンの変更時にキャッシュされた時刻が調整/刈り取られることを確実にする必要があります。

時間自体に対して何かするのでしょうか? たとえば このイベントは8時間後に発生します と表示したり、その時間帯の間、自分自身を停止させたりしますか?もしそうなら、おそらくUTCの方がよいでしょう。もちろん、前述のすべての問題を考慮する必要があります。