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?