1

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

**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

4

2 回答 2

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 "";
    }
}

我希望这将有所帮助。

于 2013-08-13T00:59:02.740 回答
0

我以前遇到过这个问题,你会发现它 t => DateTime.UtcNow <= t.EndDate不能完美地工作,所以我添加+1了结束日期以使其工作,你也可以让你的数据库中的字段DateTime而不是Date仅仅,最好将变量保留在“代码”和“数据库”相同类型

  1. 将数据库类型更改为 DateTime
  2. 我通过在结束日期添加 +1 解决了这个问题
于 2013-08-13T00:34:35.647 回答