在我的数据库中,日期存储如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()
预定义的位置。最后,您能否根据上述代码向我提供一个工作示例。
答案 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