Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从数据库查询DateTime字段时,我可以控制DateTimeKind吗?_C#_Sql Server_Datetime_Dapper - Fatal编程技术网

C# 从数据库查询DateTime字段时,我可以控制DateTimeKind吗?

C# 从数据库查询DateTime字段时,我可以控制DateTimeKind吗?,c#,sql-server,datetime,dapper,C#,Sql Server,Datetime,Dapper,当我从涉及DateTime字段的C#查询SqlServer数据库时,返回的System.DateTime具有Kind==Unspecified,这并不奇怪,因为SqlServerDateTime类型不保留时区信息 我想知道是否有一种方法可以自动将这些值读取为本地值或通用值,而不是在读取查询结果后手动转换它们,这样在缺少字段时就更容易出错 典型代码如下所示: using (var conn = ...) using (var command = ...) {

当我从涉及
DateTime
字段的C#查询SqlServer数据库时,返回的
System.DateTime
具有
Kind==Unspecified
,这并不奇怪,因为SqlServer
DateTime
类型不保留时区信息

我想知道是否有一种方法可以自动将这些值读取为本地值或通用值,而不是在读取查询结果后手动转换它们,这样在缺少字段时就更容易出错

典型代码如下所示:

    using (var conn = ...)
    using (var command = ...)
    {
        conn.Open();
        var reader = command.ExecuteReader();
        while (reader.Read())
        {
          DateTime dateField =  (DateTime)reader["date"];
          //dateField.Kind == Unspecified
        }
    }
由于它没有在数据库中持久化,您必须在检索时在自己的代码中指定它,因此DataReader中没有快捷方式方法,尽管您可以创建一个扩展方法

public static class Helper{
    public static DateTime GetDateTimeAsUtc(this IDataReader reader, string column){
        return DateTime.SpecifyKind((DateTime)reader[column], DateTimeKind.Utc);
    }
}
然后叫它

DateTime dateField = reader.GetDateTimeAsUtc("date");

据我所知,没有内置的方法可以做到这一点,但您可以轻松地为
SqlDataReader
创建自己的扩展方法,然后调用
reader.GetDateAsLocal(“date”)
reader.GetDateAsUtc(“date”)
。当DateTime存储在SQL server中时,不会存储时区信息。因此,当您检索它时,它不可用。您可以确保在将日期时间值存储在数据库中之前将其转换为UTC,也可以使用DateTimeOffset在数据库中存储日期时间值。SQL Server还具有
DateTimeOffset
类型,如果不需要毫秒(
datetimeoffset2(0)
),则该类型使用与
DateTime
相同的空间。使用
datetimeoffset
而不是
datetime
以避免猜测<代码>本地并不意味着任何东西-本地对谁来说?数据库服务器、web服务器、浏览器?即使是偏移量也要防止所有问题-如果DST规则更改会发生什么?如果这是一个问题,请存储IANA时区,并使用eg NodaTime来处理dates@PanagiotisKanavos这一切都很好,但“更改数据库”通常不属于开发人员的权限范围!这是一个非常好的模式。谢谢你编撰+1.
DateTime dateField = reader.GetDateTimeAsUtc("date");