2011-06-12 4 views

답변

7

답변은 - 다릅니다.

DateTimeOffset은 타임 스탬프 + UTC 오프셋입니다. 문제는 여러 시간대가 동일한 오프셋을 공유 할 수 있지만 (다른 것들 중에서) 동일한 일광 절약 시간 규칙을 공유하지 않을 수 있으며 DateTimeOffset에는 TimeZone이라는 개념이 없기 때문에 모호한 것으로 연결된다는 것입니다. 그러나 사용자에게 표시되지 않고 사용자가 상호 작용하지 않는 서버 측 시간 소인을 저장하는 경우 이는 괜찮을 수 있습니다. 서버 측 로깅을 예로들 수 있습니다.

IMHO 사용자 입력, 사용자 표시, 사용자 쿼리 가능 등의 타임 스탬프를 처리 할 때 가장 안전한 방법은 DateTime을 저장하고 전체 시간대 정보를 저장하는 것입니다. TimeZoneInfo.Serialize(...)을 사용하면 전체 시간대 정보를 문자열로 출력하고 데이터베이스에 유지하며 나중에 TimeZoneInfo.Deserialize(...)을 통해 TimeZoneInfo 인스턴스로 deserialize하고 DateTime을 local/utc datetime으로 변환 할 수 있습니다. 애매 모호하지 않으며 시간대가 변경 되어도 (예 : DST 변경) 데이터가 여전히 일관되므로 안전합니다. 물론 동기화를 유지하기 위해 데이터베이스를 업데이트해야합니다 (매우 드문 경우).

위의 방법을 사용하면 DateTimes를 UTC 또는 Local로 저장할 수 있으며 사용 사례에 따라 어느 것이 든 결정해야합니다. UTC로 날짜와 시간을 저장할 때 재미있는 점 중 하나는 사용자의 "오늘"이라는 개념이 약간 더 복잡해진다는 것입니다. 블로그에서이 내용을 읽을 수 있습니다 here.

+0

+1 좋은, 잘 생각한 대답 – Paul

+1

좋은 대답. .NET에 최신 버전을위한 다만 갱신. 'TimeZoneInfo.Serialize (...)'는 이제'tzInstance.ToSerializedString()'이고'TimeZoneInfo.Deserialize (...)'는 이제 TimeZoneInfo.FromSerializedString (...)'입니다. – Paul

관련 문제