代码之家  ›  专栏  ›  技术社区  ›  Aleksa Ristic

defaultview.rowfilter不使用日期

  •  1
  • Aleksa Ristic  · 技术社区  · 6 年前

    我正在使用此代码筛选行:

     (dataGridView1.DataSource as DataTable).DefaultView.RowFilter = 
          string.Format("DATUM > #{0}# AND DATUM < #{1}#", start, end);  
    

    start end 定义如下:

    DateTime dt = dateTime_DO.Value;
    DateTime dt1 = dateTime_OD.Value;
    DateTime start = new DateTime(dt1.Year, dt1.Month, dt1.Day - 1, 23, 59, 59, 59);
    DateTime end = new DateTime(dt.Year, dt.Month, dt.Day, 23, 59, 59, 59);
    

    因为某种原因,它不起作用。以下是数据源结构的屏幕截图:

    下面是它用来筛选行的字符串:

    DATUM > #8/1/2019 11:59:59 PM# AND DATUM < #12/1/2019 11:59:59 PM#

    1 回复  |  直到 6 年前
        1
  •  2
  •   Reza Aghaei    6 年前

    DateTime.ToString() 返回当前区域性格式的日期字符串,而筛选表达式将使用不变的区域性而不是当前区域性进行分析。

    所有文本表达式都必须用不变的区域性区域设置表示。当数据集解析和转换文本表达式时,它 总是使用不变的区域性,而不是当前的区域性。 [docs]

    您可以使用以下方法以正确的格式传递日期:

    dt.DefaultView.RowFilter = string.Format(CultureInfo.InvariantCulture.DateTimeFormat,
        "Column >= #{0}#", dateTimeValue);
    

    您也可以使用 standard date and time format specifiers 这样地:

    dt.DefaultView.RowFilter = string.Format(CultureInfo.InvariantCulture.DateTimeFormat,
        "Column >= #{0:d}#", dateTimeValue);