c# - 比较时间而不考虑日期

标签 c# .net datetime

我有一个对象,其属性当前为 DateTime。

对象在一个时间范围内被标记为有效。默认为 00:00:00 到 23:59:59

用户在 UI 中输入值并通过以下方式设置属性:

new DateTime(DateTime.Now.Year, 
             DateTime.Now.Month, 
             DateTime.Now.Day, 
             model.Hours, 
             model.Minutes, 
             model.Seconds)

然后当它到达数据库时转换为 UTC。

今天的日期是 2013 年 8 月 29 日。如果印度的一位同事运行该程序,它将在数据库中存储 2013 年 8 月 28 日 18:30:00 的数据,因为它们比 UTC 提前 5.5 小时,因此 2013 年 8 月 29 日 00:00 :00 成为昨天。

当逻辑试图确定对象是否有效时,逻辑是:

if (DateTime.UtcNow.TimeOfDay > model.MyPropertyFromDB.TimeOfDay)

我们正在尝试确定当前时间是否在 00:00:00 和 23:59:59 之间

因为 14:00(当前时间)不大于 18:30 而失败

比较时间的最佳方法是什么?

将值存储为 DateTimeOffSet 有帮助吗,使用 ToLocal() 可以吗?

其他考虑因素是印度的用户正在使用在英国托管的应用,因此它需要了解时区。

谢谢

最佳答案

和其他人一样,我仍然不清楚您到底想要什么。但显然,您不应该这样做:

new DateTime(DateTime.Now.Year, 
             DateTime.Now.Month, 
             DateTime.Now.Day, 
             model.Hours, 
             model.Minutes, 
             model.Seconds)

那会好得多:

DateTime.Today.Add(new TimeSpan(model.Hours, model.Minutes, model.Seconds))

但是您为什么要这样做呢?其中任何一个都会返回本地日期。我假设这将在服务器上运行,那么您真的希望服务器的时区影响这个结果吗?可能不会。请阅读:The Case Against DateTime.Now .

如果你想要 UTC 日期,你可以这样做:

DateTime.UtcNow.Date.Add(new TimeSpan(model.Hours, model.Minutes, model.Seconds))

无论您服务器的时区如何,这至少是普遍相同的。但是,我仍然认为这不是您所追求的。

不清楚的是为什么用户只在您分配当前日期时输入时间。如果日期相关,那么用户不应该输入它并且它会成为您模型的一部分吗?

如果日期不相关,那你为什么要存储它?您可以在内部使用 TimeSpan 类型作为时间值。你没有说你的数据库是什么,但我们只是猜测它是 SQL Server,在这种情况下你可以在表中的字段上使用 time 类型。

我想日期可能是相关的,但您想控制它,而用户控制提供时间。如果是这种情况,那么您必须知道用户的时区(或者如果不是用户,则无论上下文是什么时区)。假设您有一个 Windows 时区标识符(参见 the timezone tag wiki ),那么您可以这样做:

var tz = TimeZoneInfo.FindSystemTimeZoneById(theTimeZoneId);
var local = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, tz);
var dt = local.Date.Add(new TimeSpan(model.Hours, model.Minutes, model.Seconds));

如果你没有时区信息,那这个就没法解决了。

作为一般建议,您可能想尝试使用 Noda Time而不是内置的东西。它能更好地帮助您解决此类问题。来自主页:

Noda Time is an alternative date and time API for .NET. It helps you to think about your data more clearly, and express operations on that data more precisely.

这似乎是您在这里遇到的直接问题。如果您想澄清我提出的一些问题,我很乐意编辑我的答案并向您展示如何使用 Noda Time 做到这一点。

为什么你的问题令人困惑

We are trying to determine if the current time is within a range of 00:00:00 and 23:59:59

所有 时间都在该范围内。好吧,也许像 23:59:59.1 这样的值会在它之外,但是您没有在模型中收集小数秒,所以这是无关紧要的。但是为什么你需要验证它呢?也许您只是想避免使用根本不是有效时间的数字?喜欢 99:99:99

This fails as 14:00 (current time) is not greater than 18:30

等等 - 你没有说任何关于比较一次比另一次大的事情。 14:0018:30 都还在你指定的范围内。

What would be the best approach to compare just times?

很难回答。他们都是UTC时间吗?一个是UTC,一个是本地的?他们都是本地人吗?你知道本地时间的时区吗?您准备好处理夏令时转换中模棱两可或无效的本地时间了吗?

Would storing the values as DateTimeOffSet help?

也许吧,但你没有给我足够的信息。仅当日期部分相关并且您获得正确的偏移量时,它才会有所帮助。

is using ToLocal() ok?

我会说不,这不好。 Local 在这种情况下将为您提供服务器的时区,您可能不想将其引入您的业务逻辑。

关于c# - 比较时间而不考虑日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18512130/

相关文章:

c# - 在 C# 中如何为方程分配上标?

.net - 使用相同的引用变量与单独的变量。 .Net中引用变量的费用

r - 从具有 R 标准格式日期/时间的大型数据集中计算平均每日值?

c# - 如何加入数据并与另一个访问数据库进行比较

c# - 实体太大错误

c# - Windows Phone 8,将 DependencyProperty 用于用户控件、PropertyChangedCallback 和 CoerceValueCallback 问题

.net - 执行时出现简单 WCF 服务错误

.net - 将托管 C++ 添加到 C# GUI

python - Django如何管理只有小时和分钟的格式时间

python - 如何更改 pandas 中的时间格式?