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

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

  1. 如何修改DateTime的Kind属性,使其为UTC而非Unspecified? 我不想改变时间或日期。 因此,例如,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?

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

戴夫

你可能需要这样的东西:

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

关于MSDN中的 SpecifyKind()方法:

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

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

关于其他问题,这里是SQL Compact中支持的类型。 这是关于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); }