이것은 중요하고 놀랍도록 어려운 문제입니다. 진실은 시간을 유지하기 위해 완전히 만족하는 표준이 없다는 것입니다. 예를 들어, SQL 표준과 ISO 형식 (ISO 8601)으로는 충분하지 않습니다.
개념적 관점에서 하나는 일반적으로 두 가지 유형의 시간 날짜 데이터를 처리하며 " 물리적 시간 "과 " 민간 시간 "이라는 두 가지 유형의 데이터를 구분하는 것이 편리합니다 (위의 표준은 그렇지 않습니다) .
"물리적"시간 순간은 물리가 다루는 연속적인 보편적 타임 라인의 한 지점입니다 (물론 상대성을 무시 함). 이 개념은 예를 들어 UTC로 적절히 코딩되어 지속될 수 있습니다 (윤초를 무시할 수있는 경우).
"시민"시간은 민사 규범을 따르는 날짜 시간 사양입니다. 여기서 시간은 일련의 날짜 시간 필드 (Y, M, D, H, MM, S, FS)와 TZ (시간대 사양)로 완전히 지정됩니다. (실제로는 "달력"이지만 토론을 그레고리력으로 제한한다고 가정합니다). 시간대와 달력은 원칙적으로 하나의 표현에서 다른 표현으로의 매핑을 허용합니다. 그러나 민간 및 물리적 시간 순간은 근본적으로 다른 유형의 크기이며, 개념적으로 분리하여 다르게 취급해야합니다 (유사한 배열 : 바이트 배열 및 문자열).
이러한 유형의 사건을 서로 바꿔서 말할 수 있고, 시민 시대에는 정치적 변화가 있기 때문에 문제는 혼란 스럽습니다. 문제 (및 이러한 개념을 구별 할 필요성)는 미래의 이벤트에 대해 더욱 분명해집니다. 예 (내 토론 에서 가져온 것 입니다.
John은 달력에서 datetime 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
?
요한이 달력에 "Please ring me at 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 변경에도 영향을받지 않습니다.