6

datetimeoffset 値を datetime 値に変換すると、データが失われる可能性はありますか? MSDN ドキュメントから、datetimeoffset から datetime への変換は次のように言及されています。

DateTime プロパティは、DateTimeOffset から DateTime への変換を実行するために最もよく使用されます。ただし、Kind プロパティが指定されていない DateTime 値を返します。つまり、DateTime プロパティを使用すると、DateTimeOffset 値と UTC との関係に関する情報が変換によって失われます。

変換された DateTime 値が UTC 時間であることを示すために、DateTimeOffset.UtcDateTime プロパティの値を取得できます。次の 2 つの点で 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 に変換しています。後で、datetime を datetimeoffset に戻す必要があります。

例として:

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

私の質問は、どのような状況でも datetimeOffset と dofsetnew が異なるかどうかです。もしそうなら、変換は損失データになります。

4

1 に答える 1

5

記述方法 - はい、入力 DateTimeOffset が 0 以外の値である UTC オフセットとローカル タイムゾーン (最後の「else」条件) にあるときはいつでも。IMHO、そこに含まれる潜在的なタイムゾーン変換が許容できると仮定して、常に UtcDateTime を使用する方がよいでしょう。

また、ローカル タイムゾーンが DST を遵守している場合、それがどれを表しているかわからないため、毎年あいまいな時間に失われます。

損失がないことを確認する必要がある場合は、DateTime に変換せずに DateTimeOffset (SQL サーバー タイプ 'datetimeoffset') のままにするか、必要に応じて UTC オフセットを別の値として保持し、一緒に渡すようにしてください。その後、2 つの値 (DateTime とオフセット) を使用して DateTimeOffset を再構築できます。

于 2012-06-06T05:18:34.027 に答える