如何将DateTimeKind.Unspecified类型的DateTime转换为C#(.NET)中的DateTime.Kind.Utc

Dav*_*ave 28 .net c# datetime sql-server-ce

我继承了C#代码,它有很多DateTimes,其中Kind属性是DateTimeKind.Unspecified.它们被送入Datetime.ToUniversalTime(),它返回一个UTC日期时间(在我的情况下它增加了7个小时).这就是ToUniversalTime()的工作原理; 见MSDN.问题是这些DateTime实际上已经是UTC时间.它们被从SQL Server Compact 4.0数据库中取出.它们以UTC格式存储在那里.我的主要问题是:

  1. 如何修改DateTime的Kind属性,使其为UTC而不是未指定?我不想改变时间或日期.因此,例如,2013年4月1日上午9:05,其Kind属性为"未指定"的日期应该成为2013年4月1日,UTC时间9:05的日期时间.

如果我可以沉迷于后续问题,那将是:

  1. 是否必须将值从Sql Server Compact返回为"未指定"?在Sql Server Compact中,它们被存储为类型(datetime,而不是null).看一下代码,看起来它们只是放在数据库中,但没有规定将它们标记为UTC或任何东西.处理事情有更好的方法吗?是否有一种灵活的方法来确保Date Compacts以SQL Compact作为UTC?

如果我能提供更多详细信息,请通知我.我是这个代码库的新手,仍然让我的大脑围绕它,所以我很难完美地描述这个问题.

戴夫

kat*_*330 41

你可能需要这样的东西:

var unspecified = new DateTime(2016, 12, 12, 10, 10, 10, DateTimeKind.Unspecified);
var specified = DateTime.SpecifyKind(unspecified, DateTimeKind.Utc);
Run Code Online (Sandbox Code Playgroud)

关于SpecifyKind()来自MSDN的方法:

SpecifyKind方法使用指定的种类参数和原始时间值创建新的DateTime对象.

它将创建新的对象,新的Kind和同一时间值.您无法更改现有对象的种类,您需要创建具有相同值和不同种类的新对象.

关于其他问题,这里是SQL Compact支持的类型.这是与DateTimeOffset有关的问题.看起来它在Sql Compact中尚不支持.

  • 据我所知,它创建了具有不同Kind但具有相同时间值的新DateTime对象.根据你的问题,这是你需要的吗?您无法更改Kind of DateTime对象,您只能创建具有相同值和新Kind的新DateTime. (2认同)

小智 6

您可以将上述两个答案结合起来以获得更清洁的解决方案......

public static DateTime SetKind(this DateTime DT, DateTimeKind DTKind)
{        
    return DateTime.SpecifyKind(DT, DTKind);
}
Run Code Online (Sandbox Code Playgroud)