これは重要で驚くほど難しい問題です。真実は、時間を持続させるための完全に満足できる基準はないということです。たとえば、SQL標準とISO形式(ISO 8601)では明らかに不十分です。
概念的な観点から見ると、通常は2種類の日時データを扱い、それらを区別するのが便利です(上記の標準では区別されません)。「物理時間」と「常用時間」です。
「物理的」な瞬間とは、物理学が扱う連続的な普遍的なタイムラインのポイントです(もちろん、相対性理論は無視します)。この概念は、たとえばUTCで適切にコード化して永続化できます(うるう秒を無視できる場合)。
「シビル」タイムは、シビルノルムに従う日時指定です。ここでのポイントは、一連の日時フィールド(Y、M、D、H、MM、S、FS)とTZ(タイムゾーン指定)によって完全に指定されます。 (実際には「カレンダー」でもありますが、議論をグレゴリオ暦に限定するとします)。タイムゾーンとカレンダーにより、(原則として)1つの表現から別の表現へのマッピングが可能になります。しかし、民生と物理の時刻は基本的に大きさの種類が異なるため、概念的に分離し、異なる方法で処理する必要があります(類推:バイトと文字列の配列)。
私たちはこれらのタイプのイベントについて交換可能に話しているため、そして市民時代は政治的変化の影響を受けやすいため、問題は混乱しています。問題(およびこれらの概念を区別する必要性)は、将来のイベントでさらに明らかになります。例(私の議論から取らここに。
ジョンは、カレンダーに日付時刻2019-Jul-27, 10:30:00
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はこの区別を正しくしています。その中には、次の(3番目の)Java DateTime API(JSR 310)の基礎であるJodatimeがあります。
GETDATE()
SQLのこの方法はUTCになります(と同様DateTime.Now
)。また、サーバーは、DSTの自動変更の影響を受けません。