0

在我的数据库中,日期像日期时间一样存储,但是当我想执行搜索/过滤时,我希望它仅基于日期而忽略确切时间。我花了很多时间弄清楚如何去做,最后我自己找到了一个可行的解决方案:

string val = rule.Data;
if (!string.IsNullOrEmpty(val))
{
switch (rule.Field)
                    {
                        case "Date": {
                        DateTime parsedDate = DateTime.ParseExact(
                                val,
                                "dd/MM/yyyy",
                                CultureInfo.InvariantCulture);

                        var pYear = parsedDate.Year;
                        var pMonth = parsedDate.Month;
                        var pDay = parsedDate.Day;

rows = rows.Where(o => o.Date >= parsedDate && o.Date <= new DateTime(pYear, pMonth, pDay, 12, 59, 40)); break;
                        }
                    }

}

这工作正常。它需要一点改变,但我想我可以使用上面的代码。但是今天我的一所大学给了我一个解决方案,它来自以前在这里开发的项目,这个解决方案要短得多,如果可能的话,我更愿意使用它。它看起来像这样:

        string val = rule.Data;
        if (!string.IsNullOrEmpty(val))
        {
            switch (rule.Field)
            {
            case "Date": { rows = rows.Where(o => o.Date.ToString("dd/MM/yyyy") == val); break; }
            }
        }

当我尝试这个时,代码不会中断,但它也不会过滤数据。我总是得到空的结果。我想这o.Date.ToString("dd/MM/yyyy")就是问题所在。我不知道ToString()这样用于 DateTime 对象是否可以。在我使用的示例中,我ToString()还获得了一种格式类型,就像我在这里提供的那样ToString("dd/MM/yyyy")——但在我的情况下ToString(),它并没有在任何地方重载。这是操作 DateTime 对象的标准方法,还是我找不到ToStrin()预定义的位置。最后,您能否为我提供一个基于上述代码的工作示例。

4

3 回答 3

1

根据 o.Date 的文化,尝试:

    string val = rule.Data;
    if (!string.IsNullOrEmpty(val))
    {
        switch (rule.Field)
        {
              case "Date":
              {
                rows = rows.Where(o => o.Date.ToString("dd/MM/yyyy", CultureInfo.InvariantCulture) == 
                                          DateTime.ParseExact(val,
                                          "dd/MM/yyyy",
                                          CultureInfo.InvariantCulture));
                break;
              }
        }
    }

或者您可以设置当前线程的文化:

Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.InvariantCulture;

编辑:如果您避免使用字符串,它应该可以工作:

例如

DateTime maxDate = new DateTime(2020, 11, 17);

if (DateTime.Now.Date > maxDate)
{
   // this will just work regardless of setting culture
}
于 2013-06-18T08:22:24.790 回答
0

我认为如果您需要比较日期,那么您可以获取 DateTime 的 Date 组件并将其与您的预定义值进行比较。这应该更快,因为不需要每次都将日期转换为字符串。所以你可以先这样得到你的参考值DateTime.ParseExact(value, "dd/MM/yyyy", CultureInfo.InvarianCulture)。您也可以使用 DateTime 的构造函数来组合它。

于 2013-06-18T07:57:36.210 回答
0

您根本不必使用字符串。如果它是datetime数据库中的(或类似的),并且DateTime在您的 c# 代码中是 a,那么就没有充分的理由使用字符串作为中间步骤。

此外,您应该密切关注您的价值观的.Kind属性。DateTime而且您永远不应该将当地时间与DateTime.Now. 如果这样做,您可能会在夏令时转换期间引入错误。相反,您应该使用 UTCDateTime值,或者改用DateTimeOffset值。 在这里阅读更多

于 2013-06-18T18:50:23.803 回答