日期时间偏移量到日期时间转换 - 数据丢失

本文关键字:日期 时间 数据 转换 偏移量 | 更新日期: 2023-09-27 18:36:18

当我将日期时间偏移量值转换为日期时间值时,是否有数据丢失的可能性。在 MSDN 文档中,从日期时间偏移量到日期时间的转换如下所述:

属性最常用于执行 DateTimeOffset 转换为日期时间。但是,它返回一个日期时间值,该值 "种类"属性为"未指定"。这意味着有关以下方面的任何信息 日期时间偏移量值与 UTC 的关系因 使用日期时间属性时的转换。

若要指示转换后的 DateTime 值为 UTC 时间,可以检索 DateTimeOffset.UtcDateTime 属性的值。它与 DateTime 属性在两个方面有所不同:

它返回一个 DateTime 值,其 Kind 属性为 Utc。如果 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;   
}

现在在我们的系统中,我们以上述方式将日期时间偏移量转换为日期时间。稍后我们想将日期时间转换回日期时间偏移量。

举个例子:

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

我的问题是在任何情况下日期时间偏移量和dofsetnew是否不同?如果是这样,那么转换将是丢失数据。

日期时间偏移量到日期时间转换 - 数据丢失

它的编写方式 - 是的,只要输入 DateTimeOffset 处于 UTC 偏移量,即 0 和本地时区以外的任何值(最后一个"else"条件)。 恕我直言,您最好始终使用 UtcDateTime,假设所涉及的潜在时区转换是可以接受的。

此外,如果您的本地时区遵守夏令时,那么在每年的模糊小时内都会丢失,因为您不知道它代表哪一个。

如果需要确保没有损失,请不要转换为 DateTime 并保留使用 DateTimeOffset(sql 服务器类型"datetimeoffset"),或者如果必须,请将 UTC 偏移量保留为随之传递的单独值,以便随后可以使用 2 个值(日期时间和偏移量)重建 DateTimeOffset。