2012-06-05 2 views
6

datetimeoffset 값을 datetime 값으로 변환 할 때 데이터 손실 가능성이 있습니까?DateTimeOffset - DateTime 변환 - 데이터 손실

날짜 시간 속성은 가장 일반적으로 날짜 시간을 DateTimeOffset 변환을 수행하는 데 사용된다 : 다음 MSDN 문서에서 는 날짜에 DATETIMEOFFSET로부터 변환 언급된다. 그러나 Kind 속성이 Unspecified 인 DateTime 값을 반환합니다. 즉, 에 대한 정보와 DateTimeOffset 값의 UTC와의 관계는 DateTime 속성을 사용할 때 변환에 의해 손실됩니다.

변환 된 DateTime 값이 UTC 시간임을 나타내려면 DateTimeOffset.UtcDateTime 속성 값을 검색 할 수 있습니다. 두 가지 방법으로 DateTime 속성과 다릅니다.

Kind 속성이 Utc 인 DateTime 값을 반환합니다. Offset 속성 값이 TimeSpan.Zero와 같지 않으면 시간을 UTC로 변환합니다.

나는 다음과 같은 방법이 날짜 날짜 오프셋 변환하려면 다음을 참조하십시오

static DateTime ConvertFromDateTimeOffset(DateTimeOffset dateTime) 
{ 
    if (dateTime.Offset.Equals(TimeSpan.Zero)) 
     return dateTime.UtcDateTime; 
    else if (dateTime.Offset.Equals(TimeZoneInfo.Local.GetUtcOffset(dateTime.DateTime))) 
     return DateTime.SpecifyKind(dateTime.DateTime, DateTimeKind.Local); 
    else 
     return dateTime.DateTime; 
} 

지금 우리의 시스템에서 우리는 위의 방법으로 날짜에 DATETIMEOFFSET 변환된다. 나중에 datetime을 datetimeoffset으로 다시 변환하려고합니다. 예를 들어

는 :

DateTime dt = ConvertFromDateTimeOffset(datetimeOffset); 
DateTimeOffset dofsetnew = new DateTimeOffset(dt); 

내 질문은 어떤 상황과 DATETIMEOFFSET 다를 수 dofsetnew 아래 여부? 그렇다면 변환은 손실 데이터가됩니다.

답변

4

작성 방법 - 예, 입력 된 DateTimeOffset이 0이 아닌 다른 값인 로컬 시간대 (그 '마지막'else '조건)에있을 때마다 가능합니다. IMHO, 당신은 UtcDateTime을 항상 사용하는 편이 낫습니다. 거기에 관련된 잠재적 인 시간대 변환이 수용 가능하다고 가정합니다.

또한 로컬 표준 시간대가 DST를 준수하면 매년 모호한 시간에 손실이 발생합니다. 그 이유는 해당 시간대 중 어느 것이 해당 날짜를 나타내는 지 알 수 없기 때문입니다.

손실이 없는지 확인해야하는 경우 DateTime으로 변환하지 않고 DateTimeOffset (SQL Server 유형 'datetimeoffset')을 유지하거나 UTC 오프셋을 전달할 별도의 값으로 유지해야합니다 따라서 DateTimeOffset을 2 개의 값 (DateTime 및 오프셋)으로 재구성 할 수 있습니다.