当我将 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 dt = ConvertFromDateTimeOffset(datetimeOffset);
DateTimeOffset dofsetnew = new DateTimeOffset(dt);
我的问题是在任何情况下 datetimeOffset 和 dofsetnew 是否不同?如果是这样,那么转换就会丢失数据。
它的书写方式 - 是的,只要输入 DateTimeOffset 处于 UTC 偏移量,即 0 和本地时区(最后一个“else”条件)以外的任何值。恕我直言,您最好始终使用 UtcDateTime,假设其中涉及的潜在时区转换是可以接受的。
另外,如果您当地的时区遵守 DST,那么每年在不明确的时间段都会出现损失,因为您不知道它代表哪一个。
如果您需要确保没有丢失,请不要转换为 DateTime 并保留 DateTimeOffset (sql server 类型“datetimeoffset”),或者如果必须,请将 UTC 偏移量保留为与它一起传递的单独值,这样您就可以然后可以使用 2 个值(DateTime 和 offset)重建 DateTimeOffset。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)