将UTC时间与C#中的本地时间进行比较

时间:2013-08-29 15:27:47

标签: c# .net datetime datetime-comparison

我在C#中有一个Windows控制台应用程序,需要将当前时间与存储在DB中的两次进行比较。在插入DB之前,日期和时间转换为UTC。 现在,我需要获取这些值并仅将时间部分与本地时间进行比较。比方说我的日期如下:

DateTime dt1 = new DateTime(2013, 08, 29, 00, 00, 00)
DateTime dt2 = new DateTime(2013, 08, 29, 23, 59, 59)

因为我将这两个日期转换为UTC并存储在DB中,所以我的数据库值看起来像 '28 / 08/2013 18:30:00'和'29 / 08/2013 18:00:00'。

假设我当前的当地时间是'14:00:00'并且我要检查的条件是,我的当地时间应该在我的DB Datetime值的时间部分之间。 喜欢

if(DateTime.Now.TimeOfDay >= DBTime1 && DateTime.Now.TimeOfDay <= DBTime2)`
{
//true condition logic
}

如果我将db date time转换为local并进行比较,它在我的本地系统中按预期工作。我怀疑的是,如果应用程序托管在英国的服务器并从印度访问它,那么时间比较是否会按预期进行?在转换到当地时间时,我们是否需要考虑任何其他事项,如DST(Day Day Time)或TimeZone?

2 个答案:

答案 0 :(得分:1)

.NET中似乎存在一个错误(或可怕的设计选择)。正如您在第1221行开始的reference source中所看到的,DateTime比较代码只是比较InternalTicks属性,该属性具有非时区调整的滴答。这意味着这段代码:

if (ticket.Expiration > DateTime.UtcNow)

的行为与此代码不同:

if (ticket.Expiration.ToUniversalTime() > DateTime.UtcNow)

即使明确且正确地设置了DateTimeKind

答案 1 :(得分:0)

DateTime.Now.TimeOfDay的类型为DateTimeKind.Local

存储在数据库中的

DBTime1是Utc时间,应该在C#中“保湿”为DateTimeKind.Utc

DateTimeKind info

由于DB时间是UTC,当转换为本地时间时,只要本地时间信息(包括时区,DST等)设置正确,那么我就看不出为什么要将其中一个转换为另一个格式和比较会出错。事实上,走另一条路并且只使用DateTime.UtcNow:

会更容易

DateTime.UtcNow.TimeOfDay >= DbTime1 && DateTime.UtcNow.TimeOfDay <= DBTime2

请记住这意味着什么,即您正在检查当前时间(根据时区信息调整)是否在2倍之间。你确定DbTime1总是小于DbTime2吗?您可能需要进行一些检查以确保其他情况。