在DateTime对象上使用ToString

时间:2013-06-18 07:44:45

标签: c# datetime overloading object-to-string

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

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")是问题所在。我不知道在DateTime对象中使用这样的ToString()是否可以。在我使用ToString()的示例中,也获得了类似我在此处提供的格式类型 - ToString("dd/MM/yyyy") - 但在我的情况下,ToString()不会在任何地方重载。这是操作DateTime对象的标准方法,或者我找不到ToStrin()预定义的位置。最后,您能否根据上述代码向我提供一个工作示例。

3 个答案:

答案 0 :(得分: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;

修改:如果您避免使用字符串,它应该可以使用:

e.g。

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

if (DateTime.Now.Date > maxDate)
{
   // this will just work regardless of setting culture
}

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

此外,您应密切关注.Kind值的DateTime属性。你永远不应该将当地时间与DateTime.Now进行比较。如果这样做,您可能会在夏令时转换期间引入错误。相反,您应该使用UTC DateTime值,或使用DateTimeOffset值。 Read more here