如何转换DateTimeKind类型的DateTime.未指定到c# (. net)中的DateTime.Kind.Ut

本文关键字:DateTime net 中的 Ut Kind 未指定 何转换 转换 DateTimeKind 类型 | 更新日期: 2023-09-27 18:15:02

我继承了c#代码,有很多可怕的日期时间,其中类型属性是DateTimeKind.Unspecified。这些数据被输入datetime . tuniversaltime(),它返回一个UTC日期时间(在我的例子中它增加了7小时)。这就是tuniversaltime()的工作原理;看到MSDN。问题是这些DateTimes实际上已经是UTC时间了。它们是从SQL Server Compact 4.0数据库中提取出来的。它们以UTC格式存储在那里。我的主要问题是:

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

如果我可以再问一个问题的话,我会是:

  • 值是否必须从Sql Server Compact返回为"未指定"?在Sql Server Compact中,它们被存储为类型(datetime,而不是null)。看看代码,似乎它们只是放在数据库中,但没有规定将它们标记为UTC或任何东西。有更好的处理方式吗?是否有一种圆滑的方法来确保日期时间从SQL紧凑的UTC出来?
  • 如果我能提供更多的细节,请告诉我。我是这个代码库的新手,还在思考它,所以我很难完美地描述这个问题。

    戴夫

    如何转换DateTimeKind类型的DateTime.未指定到c# (. net)中的DateTime.Kind.Ut

    你可能需要这样的东西吗?

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

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

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

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

    关于其他问题,这里有SQL Compact中支持的类型。这里是关于DateTimeOffset的问题。Sql Compact中似乎还不支持。

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

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

    我使用了一个扩展方法:

    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(DateTime value)
    {
         return  DateTime.SpecifyKind(value, DateTimeKind.Utc);          
    }
    

    要了解DateTimeKind和转换,请参见使用和不使用DateTimeKind时代码和结果的差异

    var plainDate = new DateTime(2020, 1, 1, 0, 30, 0);
    Console.WriteLine(plainDate);  // 2020-01-01 00:30:00
    Console.WriteLine(plainDate.ToUniversalTime());  // 2019-12-31 23:30:00
    Console.WriteLine(plainDate.ToLocalTime());  // 2020-01-01 01:30:00
    

    创建DateTimes__时始终指定DateTimeKind参数。这有助于应用程序理解它正在管理哪种类型的日期。

    var specificDate = new DateTime(2020, 1, 1, 0, 30, 0, DateTimeKind.Utc);
    Console.WriteLine(specificDate); //2020-01-01 00:30:00
    Console.WriteLine(specificDate.ToUniversalTime()); //2020-01-01 00:30:00
    Console.WriteLine(specificDate.ToLocalTime()); //2020-01-01 00:30:00
    

    DateTimeKind只有3个可能的值:Unspecified, Utc, Local

    public enum DateTimeKind
    {
        Unspecified,
        Utc,
        Local
    }