【问题标题】:DateTimeOffset to DateTime conversion - Data LossDateTimeOffset 到 DateTime 的转换 - 数据丢失
【发布时间】:2012-06-09 23:48:52
【问题描述】:

当我将 datetimeoffset 值转换为 datetime 值时,是否存在数据丢失的可能性。 从 MSDN 文档中提到了从 datetimeoffset 到 datetime 的转换:

DateTime 属性最常用于执行 DateTimeOffset 到日期时间转换。但是,它返回一个 DateTime 值,其 种类属性未指定。这意味着任何有关 DateTimeOffset 值与 UTC 的关系被 使用 DateTime 属性时的转换。

要指示转换后的 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;   
}

现在在我们的系统中,我们以上述方式将 datetimeoffset 转换为 datetime。稍后我们想将 datetime 转换回 datetimeoffset。

举个例子:

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

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

【问题讨论】:

    标签: c# .net


    【解决方案1】:

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

    另外,如果您当地的时区遵守 DST,那么在每年的模棱两可的时间里都会有损失,因为您不知道它代表哪一个。

    如果您需要确保没有丢失,请不要转换为 DateTime 并保留 DateTimeOffset(sql 服务器类型“datetimeoffset”),或者如果必须,请将 UTC 偏移量保留为一个单独的值,并与它一起传递,因此您可以使用 2 个值(日期时间和偏移量)重建 DateTimeOffset。

    【讨论】:

      猜你喜欢
      • 2012-12-05
      • 1970-01-01
      • 2013-07-25
      • 2019-09-02
      • 1970-01-01
      • 2015-03-28
      • 2015-03-13
      • 2018-04-28
      • 2011-06-24
      相关资源
      最近更新 更多