当我将datetimeoffset值转换为datetime值时,是否有可能丢失数据。 从MSDN文档中,提到从datetimeoffset到datetime的转换如下:
DateTime属性最常用于执行DateTimeOffset 到DateTime转换。但是,它返回一个DateTime值 善良的财产是未指定的。这意味着任何有关的信息 DateTimeOffset值与UTC的关系丢失了 使用DateTime属性时的转换。
要指示转换的DateTime值是UTC时间,您可以检索DateTimeOffset.UtcDateTime属性的值。它与DateTime属性有两种不同的方式:
返回Kind属性为Utc的DateTime值。 如果Offset属性值不等于TimeSpan.Zero,则会将时间转换为UTC。
我看到以下方法将datetime offset转换为datetime:
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是否会有所不同?如果是,则转换将是损失数据。
答案 0 :(得分:5)
它的编写方式 - 是的,任何时候输入的DateTimeOffset都是UTC偏移,它是0以外的任何值和你的本地时区(最后'其他'条件)。恕我直言,你最好总是使用UtcDateTime,假设那里涉及的潜在时区转换是可以接受的。
另外,如果您当地的时区遵守夏令时,那么每年的模糊时间都会有损失,因为您不知道它代表哪一个。
如果您需要确保没有丢失,请不要转换为DateTime并保持DateTimeOffset(sql server type'datetimeoffset'),或者如果必须,将UTC偏移保持为您传递的单独值,因此您可以使用2个值(DateTime和offset)重建DateTimeOffset。