我有一张表格,其中包含有关何时休假的信息。两个关键字段是:
** SQL
StartDate DATE NOT NULL,
EndDate DATE NULL
在我的.Net代码中,这些代码存储为DateTime
类型。
因此,如果用户从8月13日到8月13日有假期,则有1天假期。日期应该是包含的,开始时间是0:00(午夜),然后EndDate基本上是23:59.59。
因此,根据它的开始或结束,它们的处理方式略有不同。
我的系统全天工作。即DATE值。我根本不使用Time,但因为.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日到8月13日,它将从8月12日到14日午夜检查。这似乎是hacky,但可能是我唯一的解决方案。或者,截断DateTime.UtcNow
将其设置为午夜,然后将检查更改为:
t => DateTime.UtcNow <= t.EndDate && SetToMidnight(DateTime.UtcNow) >= t.StartDate
(或者,不要使用&#39; SetToMidnight ....&#39;,只需使用DateTime.UtcNow.Date)
是否有更好的方法来处理此解决方案,或者我是否需要执行上述可能的解决方案之一?
(注意,TimeZones和其他问题中正在处理的所有内容) 第十
答案 0 :(得分:2)
尝试DateTime.UtcNow.Date
public string AvailableToday
{
get
{
if (NonAvailibility != null)
{
var i = NonAvailibility.FirstOrDefault(t => DateTime.UtcNow.Date <= t.EndDate && DateTime.UtcNow.Date >= t.StartDate);
if (i != null) return i.NonAvailibilityType ;
return "";
}
return "";
}
}
我希望这会有所帮助。
答案 1 :(得分:0)
t => DateTime.UtcNow <= t.EndDate
运行不正常,因此我将+1
添加到结束日期以使其正常工作,您也可以将数据库中的字段设为DateTime
而不是Date
只有,最好将变量保持在“代码”和“数据库”相同的类型