답변:
비계산 프로그래밍에서 가장 어려운 문제 중 하나에 오신 것을 환영합니다. 최종 사용자에게 날짜와 시간을 올바르게 표시합니다.
현실적으로 타임 스탬프는 해석 방법에 관계없이 고정 된 단일 표현으로 저장해야합니다. 아무리 노력해도 항상 모호한 경우가 있으며 고정 표현 없이는 해결할 수 없기 때문입니다. 그리고 약속 일정 예약 중 최악의 사용 사례 중 하나를 선택했습니다. 최악의 일반적인 사용 사례는 항공 여행으로, 여행은 한 시간대에서 시작하여 다른 시간대로 끝날 수 있습니다.
항상 항상 항상 UTC로 저장하고 사용자가 선호하거나 명시 적으로 지정한 시간대로 표시합니다. 가능한 경우 사용자가 타임 스탬프를 입력 할 때 타임 스탬프가 어느 시간대에 있다고 생각하는지 알려주십시오 ( 예 : 명시 적 시간대 필드가 있고 선호하는 시간대로 미리 채움).
날짜 / 시간 정보를 처리하는 가장 쉬운 방법은 응용 프로그램의 요구 사항에 따라 다릅니다.
사용자가 날짜와 시간을 입력하고 데이터베이스에 저장하는 것을 제외하고 서버가 해당 날짜 / 시간 정보를 처리하지 않고 입력 한 시간이 표시된 위치에 적응 될 것으로 예상되지 않는 경우 (예 : , 사용자가 "8:00 PM"을 입력하면 세계 어디에서 보든 관계없이 "8:00 PM"으로 표시되어야합니다.) 가장 쉬운 방법은 시간대 정보없이 DateTime을 현지 시간으로 저장하는 것입니다.
반면에 서버가 입력 한 DateTime을 트리거로 사용하여 무언가를 수행하거나 시간을 현재 시간대로 올바르게 조정해야하는 경우 DateTime을 UTC 시간으로 저장하고 로컬로 조정하는 것이 가장 좋습니다. 데이터베이스에서 읽을 때마다 시간 (사용자의 현재 위치)
두 가지 관련 개념을 혼동하지 않는 것이 중요합니다.
실제 특정 시점, 즉 특정 날짜의 특정 시간을 조작하는 경우이를 수행 할 수있는 유일한 방법은 항상 범용 UTC 시간 값을 사용하는 것입니다. 이를 시간대 관련 값으로 저장하지 마십시오. 이 시간 값을 사용자에게 표시 할 때는 항상 해당 시간의 사용자 시간대로 변환하십시오. (시간과 날짜를 모두 시간대에 따라 결정하는 것을 잊지 마십시오.)
다른 개념은 "매주 화요일 오후 8시"와 같은 "시간 표현"이라는 개념입니다. 사람들이 약속을 잡을 수 있도록 구체적으로 언급했으며, 반복적 인 약속이있는 경우 그러한 표현이 필요합니다. 나는 표준 표현 언어를 모르지만, 당신이 무엇을 사용하든, 그것을 지정한 사람의 시간대와 관련이 있습니다. 예를 들어 "매주 화요일 태평양 표준시 기준 오후 8시"와 같이 명시 적으로 작성하는 것이 가장 좋습니다. 시간 표현식의 경우이를 항상 문자열로 저장하고 시스템 시간 형식을 포함하지 않습니다.
내 블로그에서 이에 대한 자세한 내용을 참조하십시오
여기에 많은 답변이 UTC로 저장되었음을 나타냅니다. 그러나 이것을 조심하십시오. 예를 들어, 12:00시에 약속을 예약했지만 일광 절약 시간 제로 변경 한 후에 약속이 이루어지면 어떻게됩니까? UTC는 약속이 저장 될 때 dst가 활성화되었는지 여부에 대한 정보를 유지하지 않습니다. UTC에서 다시 계산하는 것은 날짜 시간을 볼 때에 따라 달라지기 때문에 사용자가 여름에 오전 9시에 이메일을 보내면 겨울에 보낸 시간이 오전 8시에 표시되는 크고 유명한 시스템이 많이 발생했습니다. 날짜 시간이 기록 될 때는 켜져 있지 않습니다.
사용자가 항상 선택한 시간을 원한다고 가정하는 것이 훨씬 좋습니다. UTC 변환, 시간 변환, 시간대 정보, 아무것도 없음. 2016 년 3 월 21 일 08 : 00 ~ 12 : 00에 예약하는 것이 바로 그 것입니다. 현지 시간이나 UTC 시간을 사용하지 않지만 지정되지 않은 시간을 사용하지 마십시오 (json에는 z 또는 +가 없으며 기본적으로 .NET에는 DateTime.Kind = DateTimeKind.Unspecified가 있음).
물론, 유스 케이스가 다른 시간대의 다른 사람과 회의를하는 회사이고 회사 달력에서이 정보를 보려고하지만 사용자가 시간대에있는 시간을 볼 수있게하려면 더 복잡해집니다. 다른 시간대 (공급 업체 및 고객)의 다른 사람들에 대해 시간이 정확해야합니다.
이 경우 약속이 데이터베이스에 저장된 시간 , 시간대 및 dst 포함 여부 를 기록 할 수도 있습니다 . 이렇게하면 항상 현재 시간 또는 과거의 시간으로 다른 시간으로 현지 시간을 계산할 수 있습니다. 시간대는 정적이지 않기 때문에 훨씬 복잡합니다.
다행히도 http://nodatime.org/ 와 같은 라이브러리가 들어 와서 강력히 권장됩니다. 날짜를 훨씬 더 일관되게 처리합니다. 그럼에도 불구하고 인터페이스를 사용하여 조롱 할 수있는 인터페이스를 사용하여 모든 날짜 시간 변수와 논리를 랩퍼로 래핑하는 것이 좋습니다. 그런 다음 나중에 논리를 전환 할 수 있습니다.