从SQL Server中假设本地而不是未指定的DateTime

时间:2015-09-21 09:36:37

标签: .net sql-server datetime sqlclient

由于SQL Server数据类型datetime不保留任何时区信息,因此.NET中的SqlClient将DateTime设置为Kind的所有DateTimeKind.Unspecified对象实例化。从理论上讲,这是正确的事情。但是,我工作过的几乎所有应用程序都存储了日期时间,假设它是本地的,并且长时间生活愉快。

但是当全球化需求出现时,这个假设/惯例会有一些问题。例如,JSON序列化是不可信的!

所以问题是:是否可以在数据库或Web服务器上执行某些操作,以强制执行从数据库读取的日期时间(通过SqlClient.DataReader.GetDateTimeDateTimeKind.Local

1 个答案:

答案 0 :(得分:1)

我认为没有任何方法可以强制执行从阅读器中取出的DateTime被自动假定为当地时间,但它很容易立即更改之后使用SpecifyKind方法:

var unspecifiedValue = yourReader.GetDateTime(yourColumn);
var localValue = DateTime.SpecifyKind(unspecifiedValue, DateTimeKind.Local);

如果您愿意,也可以使用扩展方法将其包装起来(要么像我在这里做的那样对DateTimeKind进行硬编码,将其作为参数传递,要么从配置中拉出来):

var localValue = yourReader.GetLocalDateTime(yourColumn);

// ...

public static DateTime GetLocalDateTime(this IDataRecord source, int i)
{
    if (source == null) throw new ArgumentNullException("source");
    return DateTime.SpecifyKind(source.GetDateTime(i), DateTimeKind.Local);
}