我继承了 C# 代码,其中包含大量 DateTimes,其中 Kind 属性为 DateTimeKind.Unspecified。这些被送入 Datetime.ToUniversalTime() 返回一个 UTC 日期时间(在我的例子中它增加了 7 小时)。这就是 ToUniversalTime() 的工作原理;请参阅 MSDN。 问题是这些日期时间实际上已经是 UTC 时间了。它们是从 SQL Server Compact 4.0 数据库中提取出来的。它们以 UTC 存储在那里。我的主要问题是:
如果我可以沉迷于后续问题,那将是:
如果我可以提供更多详细信息,请告诉我。我是这个代码库的新手,仍然在思考它,所以我无法完美地描述问题。
戴夫
你可能需要这样的东西:
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 中还不支持。
您可以将以上两个答案结合起来以获得更清洁的解决方案...
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
创建
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
}