如何在 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 存储在那里。我的主要问题是:
- 如何修改 DateTime 的种类 属性 使其成为 UTC 而不是未指定的?我不想更改时间或日期。因此,例如,2013 年 4 月 1 日 9:05 的日期 属性 的 "Unspecified" 应该成为 2013 年 4 月 1 日 9:05 UTC 的日期时间。
如果我可以沉迷于后续问题,那将是:
- 从 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);
}
我继承了 C# 代码,其中有大量 DateTimes,其中 Kind 属性 是 DateTimeKind.Unspecified。这些被送入 Datetime.ToUniversalTime() 返回一个 UTC 日期时间(在我的例子中它增加了 7 小时)。这就是 ToUniversalTime() 的工作原理;请参阅 MSDN。 问题是这些日期时间实际上已经是 UTC 时间了。它们是从 SQL Server Compact 4.0 数据库中提取出来的。它们以 UTC 存储在那里。我的主要问题是:
- 如何修改 DateTime 的种类 属性 使其成为 UTC 而不是未指定的?我不想更改时间或日期。因此,例如,2013 年 4 月 1 日 9:05 的日期 属性 的 "Unspecified" 应该成为 2013 年 4 月 1 日 9:05 UTC 的日期时间。
如果我可以沉迷于后续问题,那将是:
- 从 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);
}