处理开始和结束日期的DATETIME和DATE

时间:2013-08-13 00:23:11

标签: c# datetime

我有一张表格,其中包含有关何时休假的信息。两个关键字段是:

** 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和其他问题中正在处理的所有内容) 第十

2 个答案:

答案 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只有,最好将变量保持在“代码”和“数据库”相同的类型

  1. 将数据库类型更改为DateTime
  2. 我解决了这个问题,就像你在结束日期添加+1一样