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

bogh5gae  于 2023-02-10  发布在  .NET
关注(0)|答案(4)|浏览(165)

我继承了一段C#代码,其中包含大量的DateTime,Kind属性为DateTimeKind.Unspecified。这些DateTime被输入到Datetime.ToUniversalTime()中,后者返回一个UTC日期时间(在我的例子中,它增加了7个小时)。问题是这些日期时间实际上已经是UTC时间了。它们是从SQL Server Compact 4.0数据库中提取出来的。它们是以UTC时间存储在那里的。我的主要问题是:
1.如何修改DateTime的Kind属性,使其为UTC而不是Unspecified?我不想更改时间或日期。因此,例如,Kind属性为“Unspecified”的日期April 1st 2013,9:05 am应变为日期时间April 1st 2013,9:05 UTC。
如果我能提出一个后续问题,那就是:
1.值是否必须从SQL Server Compact返回为“Unspecified”?在SQL Server Compact中,它们存储为类型(datetime,而不是null)。查看代码,似乎只是将它们放入数据库中,但没有规定将它们标记为UTC或任何内容。是否有更好的方法来处理这些问题?是否有更灵活的方法来确保DateTimes从SQL Compact中输出为UTC?
如果我能提供更多的细节,请告诉我。我是这个代码库的新手,还在学习它,所以我很难完美地描述这个问题。
戴夫

2hh7jdfx

2hh7jdfx1#

你也许需要这样的东西:

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

关于MSDN中的SpecifyKind()方法:
SpecifyKind方法使用指定的种类参数和原始时间值创建新的DateTime对象。
它将创建新对象、新种类和相同的时间值。您不能更改现有对象的种类,您需要创建具有相同值和不同种类的新对象。
关于其他问题,这里是SQL Compact中支持的类型。这里是关于DateTimeOffset的问题。看起来它在Sql Compact中还不受支持。

lrpiutwd

lrpiutwd2#

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

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

qgelzfjb3#

我使用扩展方法:

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)
6jygbczu

6jygbczu4#

public static DateTime SetKind(DateTime value)
{
     return  DateTime.SpecifyKind(value, DateTimeKind.Utc);          
}

相关问题