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

How to convert DateTime of type DateTimeKind.Unspecified to DateTime.Kind.Utc in C# (.NET)

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

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

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

  1. 从 Sql Server Compact 返回的值一定是 "Unspecified" 吗?在 Sql Server Compact 中,它们被存储为类型(日期时间,非空)。查看代码,它们似乎只是放入数据库中,但没有规定将它们标记为 UTC 或其他任何内容。有没有更好的方法来处理事情?有没有一种巧妙的方法来确保 DateTimes 从 SQL Compact as UTC 出来?

如果我可以提供更多详细信息,请告诉我。我是这个代码库的新手,仍在思考它,所以我无法完美地描述问题。

戴夫

您是否需要这样的东西:

var unspecified = new DateTime(2016, 12, 12, 10, 10, 10, DateTimeKind.Unspecified);
var specified = DateTime.SpecifyKind(unspecified, DateTimeKind.Utc);

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

The SpecifyKind method creates a new DateTime object using the specified kind parameter and the original time value.

它将创建新对象、新种类和相同的时间值。您不能更改现有对象的种类,您需要创建具有相同值和不同种类的新对象。

关于其他问题,这里是 SQL Compact. And here is issue regarding to DateTimeOffset 中支持的类型。 Sql Compact 似乎还不支持它。

我使用扩展方法:

public static DateTime SetKind(this DateTime DT, DateTimeKind DTKind)
{        
    var NewDT = New DateTime(DT.Year, DT.Month, DT.Day, DT.Hour, DT.Minute, DT.Second, DT.Millisecond, DTKind);
    Return NewDT;
}

在 LINQ 中使用这比每次都必须输入 DateTime.SpecifyKind(unspecified, DateTimeKind.Utc) 要短得多。

例如:

table.Where((x) x.StartTimeStampUTC.SetKind(DateTimeKind.Utc).ToString("G") = GUIStartTimeStampTxt.Text)

您可以结合以上两个答案以获得更简洁的解决方案...

public static DateTime SetKind(this DateTime DT, DateTimeKind DTKind)
{        
    return DateTime.SpecifyKind(DT, DTKind);
}