これは重要かつ驚くほど難しい問題です。真実は、永続的な時間について完全に満足できる基準がないということです。たとえば、SQL 標準と ISO 形式 (ISO 8601) では明らかに十分ではありません。
概念的な観点から、通常は 2 種類の日時データを扱いますが、それらを区別すると便利です (上記の標準では区別されません): 「物理時間」と「常用時間」。
「物理的な」時間の瞬間は、物理学が扱う連続的な普遍的なタイムライン内のポイントです (もちろん、相対性は無視されます)。この概念は、たとえば、UTC で適切にコード化して永続化できます (うるう秒を無視できる場合)。
「市民の」時間は、市民の規範に従う日時指定です。ここでの時間は、一連の日時フィールド (Y、M、D、H、MM、S、FS) と TZ (タイムゾーン指定) によって完全に指定されます。 (実際には「カレンダー」でもありますが、議論をグレゴリオ暦に限定すると仮定しましょう)。タイムゾーンとカレンダーを併用すると、(原則として) ある表現から別の表現へのマッピングが可能になります。しかし、常用時刻と物理時刻は根本的に異なるタイプのマグニチュードであり、概念的に分離し、異なる方法で処理する必要があります (類推: バイト配列と文字列)。
この問題は混乱を招きます。なぜなら、私たちはこれらのタイプの出来事を同じ意味で話しているからです。問題 (およびこれらの概念を区別する必要性) は、将来のイベントでより明らかになります。例(ここでの私の議論から取られました。
2019-Jul-27, 10:30:00
John は、 datetime 、 TZ=にあるイベントのリマインダーをカレンダーに記録します
Chile/Santiago
(オフセット GMT-4 があるため、 UTC に対応し2019-Jul-27 14:30:00
ます)。しかし、将来のある日、国は TZ オフセットを GMT-5 に変更することを決定します。
さて、その日が来たら...そのリマインダーがトリガーされるはずです
A) 2019-Jul-27 10:30:00 Chile/Santiago
= UTC time 2019-Jul-27 15:30:00
?
また
B) 2019-Jul-27 9:30:00 Chile/Santiago
= UTC time 2019-Jul-27 14:30:00
?
ジョンがカレンダーに「電話してください」と言ったときに概念的に何を意味していたのかを理解していない限り、正解はありません2019-Jul-27, 10:30:00
TZ=Chile/Santiago
。
彼は「市民の日時」(「私の街の時計が 10:30 を示しているとき」) を意味していたのでしょうか? その場合、A)が正解です。
それとも、彼は「物理的な瞬間」、つまり私たちの宇宙の時間の連続線のポイント、つまり「次の日食が起こるとき」を意味したのでしょうか. その場合、答え B) が正しいものです。
いくつかの日付/時刻 API は、この区別を正しく行っています。そのうちのJodatimeは、次の (3 番目の!) Java DateTime API (JSR 310) の基盤です。