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

问题描述 投票:0回答:5

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

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

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

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

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

戴夫

c# .net datetime sql-server-ce
5个回答
84
投票

你可能需要这样的东西:

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

关于

SpecifyKind()
方法来自MSDN

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

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

关于其他问题,这里是 SQL Compact 中支持的类型。这是关于 DateTimeOffset 的问题。看起来它在 Sql Compact 中还不支持。


8
投票

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

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

4
投票

我使用扩展方法:

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)

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

0
投票

要了解

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

创建

DateTimeKind
时始终指定
DateTimes__
参数。这有助于应用程序了解它管理的是哪种日期。

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
}
© www.soinside.com 2019 - 2024. All rights reserved.