像其他人一样,我仍然不清楚您到底想要什么。但显然,你不应该这样做:
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))
但是你为什么要这样做呢?这些中的任何一个都会给你回本地日期。我假设这将在服务器上运行,所以你真的希望服务器的时区影响这个结果吗?可能不是。请阅读:反对 DateTime.Now 的案例。
如果你想要 UTC 日期,你可以这样做:
DateTime.UtcNow.Date.Add(new TimeSpan(model.Hours, model.Minutes, model.Seconds))
无论您的服务器的时区如何,这至少是普遍相同的。但是,我认为这不是你所追求的。
不清楚的是为什么用户只在您分配当前日期时输入时间。如果日期是相关的,那么用户不应该输入它并且它将成为您模型的一部分吗?
如果日期不相关,那么为什么要存储它?您可以在内部使用TimeSpan
类型作为时间值。你没有说你的数据库是什么,但我们只是猜测它是 SQL Server,在这种情况下你可以使用time
表中字段的类型。
我想日期可能是相关的,但你想控制它,而用户控制提供时间。如果是这种情况,那么您必须知道用户的时区(如果不是用户,则必须知道上下文的时区)。假设您有一个 Windows 时区标识符(请参阅时区标签 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 是 .NET 的替代日期和时间 API。它可以帮助您更清晰地思考数据,并更准确地表达对该数据的操作。
这似乎直接是您在这里遇到的问题。如果您想澄清我提出的一些问题,我很乐意编辑我的答案并向您展示如何使用 Noda Time 做到这一点。
为什么你的问题令人困惑
我们正在尝试确定当前时间是否在 00:00:00 和 23:59:59 的范围内
所有时间都在这个范围内。好吧,也许像这样的值23:59:59.1
会在它之外,但是您没有在模型中收集小数秒,所以这无关紧要。但是为什么你需要验证呢?也许您只是想避免根本不是有效时间的数字?喜欢99:99:99
?
这失败了,因为 14:00(当前时间)不大于 18:30
等等 - 你没有说任何关于比较一次比另一次更大的事情。 14:00
并且18:30
都仍在您指定的范围内。
比较时间的最佳方法是什么?
很难回答。它们都是UTC时间吗?一个UTC,一个是本地的吗?他们都是本地人吗?你知道当地时间的时区吗?您准备好处理模糊或无效的当地时间到夏令时转换了吗?
将值存储为 DateTimeOffSet 有帮助吗?
也许吧,但你没有给我足够的信息。仅当日期部分相关并且您获得正确的偏移量时才会有所帮助。
使用 ToLocal() 好吗?
我会争辩说,不,这不好。在这种情况下,本地将为您提供服务器的时区,您可能不想将其引入业务逻辑中。