我正在尝试按日期过滤数据,字段的日期格式为短日期。 我过滤的日期看起来像这个例子'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
如何克服此错误?
由于
答案 0 :(得分:1)
在服务器上,字符串可能不像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();
E.g。该函数将包含日志记录,因此当发生错误时,可以在日志文件中找到日期时间字符串,并且可以将正确的格式附加到使用的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"
};