2

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

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

当我将这两个日期转换为 UTC 并存储在 DB 中时,我的 DB 值看起来像“28/08/2013 18:30:00”和“29/08/2013 18:00:00”。

假设我当前的当地时间是“14:00:00”,我要检查的条件是,我的当地时间应该在我的数据库日期时间值的时间部分之间。喜欢

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

如果我将 db 日期时间转换为本地时间并进行比较,它会在我的本地系统中按预期工作。我的疑问是,如果应用程序托管在英国的服务器上并从印度访问它,时间比较会按预期工作吗?在转换为当地时间时,我们是否需要考虑任何其他事情,例如 DST(夏令时)或 TimeZone?

4

2 回答 2

1

.NET 中似乎存在错误(或糟糕的设计选择)。正如您在从第 1221 行开始的参考源DateTime中看到的那样,比较代码只是比较InternalTicks具有非时区调整刻度的属性。这意味着这段代码:

if (ticket.Expiration > DateTime.UtcNow)

行为与此代码不同:

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

即使DateTimeKind是明确且正确设置。

于 2015-09-10T22:21:01.087 回答
0

DateTime.Now.TimeOfDay是类型DateTimeKind.Local

DBTime1,存储在数据库中,是 Utc 时间,应该在 C# 中“水合”为DateTimeKind.Utc

日期时间种类信息

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

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

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

于 2013-08-29T15:53:43.537 回答