Linq to SQL DateTime值是本地的(Kind = Unspecified)
是不是有一种(简单)的方法来告诉Linq To SQL类,一个特定的DateTime属性应该被认为是UTC(即默认情况下,将DateTime类型的Kind属性设置为Utc),还是有一个“干净的”解决方法?
我的应用程序服务器上的时区与SQL 2005 Server不同(不能更改任何内容),且没有一个是UTC。 当我将DateTime类型的属性保存到dB时,我使用UTC值(因此db列中的值是UTC),但是当我读取值(使用Linq To SQL)时,我得到DateTime的.Kind属性值为'未指定'。
问题是,当我将其转换为UTC时,它会关闭4个小时。 这也意味着,当它被序列化时,它最终会在客户端发生4小时的错误偏移量(因为它使用UTC序列化)。
生成的LinqToSql代码提供可扩展性点,因此您可以在加载对象时设置值。
关键是创建一个扩展生成类的分类,然后实现OnLoaded
部分方法。
例如,假设你的类是Person
,所以你在Blah.designer.cs
有一个生成的部分Person
类。
通过创建一个新类来扩展部分类(必须位于不同的文件中),如下所示:
public partial class Person {
partial void OnLoaded() {
this._BirthDate = DateTime.SpecifyKind(this._BirthDate, DateTimeKind.Utc);
}
}
SQL Server DateTime不包含任何时区或DateTimeKind信息,因此从数据库中正确检索的DateTime值具有Kind = DateTimeKind.Unspecified。
如果你想让这些时间UTC,你应该'转换'他们如下:
DateTime utcDateTime = new DateTime(databaseDateTime.Ticks, DateTimeKind.Utc);
或同等的:
DateTime utcDateTime = DateTime.SpecifyKind(databaseDateTime, DateTimeKind.Utc);
我假设你的问题在于你试图按如下方式转换它们:
DateTime utcDateTime = databaseDateTime.ToUniversalTime();
这乍一看似乎是合理的,但根据DateTime.ToUniversalTime的MSDN文档,在转换Kind类型为Unspecified的DateTime时:
当前的DateTime对象被假定为本地时间,并且转换的执行类似于Kind是Local。
此行为对于.NET 1.x的向后兼容性是必需的,它没有DateTime.Kind属性。
我能想到做到这一点的唯一方法是在一个部分类中添加一个shim属性来完成翻译...
链接地址: http://www.djcxy.com/p/46633.html上一篇: Linq to SQL DateTime values are local (Kind=Unspecified)
下一篇: What is the significance of the order of statements in mysql explain output?