我有一张表格,其中包含有关某人何时休假的信息。两个关键字段是:
**SQL
StartDate DATE NOT NULL,
EndDate DATE NULL
在我的 .Net 代码中,这些存储为DateTime
类型。
因此,如果用户从 8 月 13 日到 8 月 13 日放假,那就是 1 天假。日期应包含在内,开始时间为 0:00(午夜),然后结束日期基本上为 23:59.59。
因此,根据它是开始还是结束,它们的处理方式略有不同。
我的系统可以整天工作。即日期值。我根本不使用时间,但由于.Net 中的 DateTime 类型而被迫使用。但是从数据库中读取时,它们都设置为午夜。
我关注的代码不起作用,是这样的:
public string AvailableToday
{
get
{
if (NonAvailibility != null)
{
var i = NonAvailibility.FirstOrDefault(t => DateTime.UtcNow <= t.EndDate && DateTime.UtcNow >= t.StartDate);
if (i != null) return i.NonAvailibilityType ;
return "";
}
return "";
}
}
该代码的重点是返回此人今天不可用的原因。如果此人可用,我应该返回一个空字符串。
问题是,我正在测试的用户从 8 月 12 日到 8 月 13 日离开。
那应该是整整两天。但是因为DateTime.UtcNow
返回当前日期和时间,而我们现在已经进入 13 号了……代码是说他今天没有休假。
解决方法可能是在 EndDate 值上增加一天?因此,它将检查从 8 月 12 日到 14 日午夜,而不是 8 月 12 日到 8 月 13 日。这看起来很老套,但可能是我唯一的解决方案。或者,截断DateTime.UtcNow
以将其设置为午夜,然后将检查更改为:
t => DateTime.UtcNow <= t.EndDate && SetToMidnight(DateTime.UtcNow) >= t.StartDate
(或者,不要使用“SetToMidnight ....”,而是使用 DateTime.UtcNow.Date)
有没有更好的方法来处理这个解决方案,还是我需要做上述可能的解决方案之一?
(注意,TimeZones 和其他问题正在处理的所有内容)第 10