尝试使用linq过滤数据时,字符串未被识别为有效的DateTime
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了尝试使用linq过滤数据时,字符串未被识别为有效的DateTime相关的知识,希望对你有一定的参考价值。
我试图按日期过滤数据,字段的日期格式是短日期。我过滤的日期看起来像这个例子'16 -12-2017'。
我使用的查询如下所示。
data = data.Where(d => DateTime.ParseExact(d.InteractionDate, "dd-MM-yyyy", CultureInfo.InvariantCulture) >= DateTime.ParseExact(filter.StartDate, "dd-MM-yyyy", CultureInfo.InvariantCulture)
&& DateTime.ParseExact(d.InteractionDate, "dd-MM-yyyy", CultureInfo.InvariantCulture) <= DateTime.ParseExact(filter.EndDate, "dd-MM-yyyy", CultureInfo.InvariantCulture)).ToList();
例子
StartDate = "01-12-2017"
EndDate = "16-12-2017"
IntersectionDate = "20-06-2017"
在我的本地机器上,这工作正常,但发布到IIS后,我得到错误。
String was not recognized as a valid DateTime
我怎样才能克服这个错误?
谢谢
答案
在服务器上,字符串可能没有像dd-MM-yyyy
那样格式化,但不同。有必要找出服务器上字符串的样子。
过滤可以使用例如像ParseDateTime
这样的函数将接收预定义格式的数组,因此代码在本地机器和服务器等上以不同的格式工作。
data = data.Where(d => ParseDateTime(d.InteractionDate, DateTimeFormats) >= ParseDateTime(filter.StartDate, DateTimeFormats) &&
ParseDateTime(d.InteractionDate, DateTimeFormats) <= ParseDateTime(filter.EndDate, DateTimeFormats))
.ToList();
例如。该函数将包含日志记录,因此当发生错误时,可以在日志文件中找到日期时间字符串,并且可以将正确的格式附加到使用的formats
数组中。
private static DateTime ParseDateTime(string dateTimeString, string[] formats)
{
try
{
DateTime dateStamp = DateTime.ParseExact(dateTimeString,
formats, CultureInfo.CurrentCulture, DateTimeStyles.None);
return dateStamp;
}
catch (Exception ex)
{
Logger.Error(ex, $"dateTimeString: '{dateTimeString}', '{string.Join(",", formats)}'.");
throw;
}
}
预定义格式的外观示例。 HTH
public string[] DateTimeFormats => new string[]
{
"dd-MM-yyyy",
"MM/dd/yyyy",
"dd/MM/yyyy",
"M/d/yyyy",
"d.M.yyyy",
"dd.MM.yyyy",
"MM/dd/yyyy",
"M/d/yyyy"
};
以上是关于尝试使用linq过滤数据时,字符串未被识别为有效的DateTime的主要内容,如果未能解决你的问题,请参考以下文章
字符串“04/28/2021 04:25p”未被识别为有效的日期时间