尝试使用linq过滤数据时,字符串未被识别为有效的DateTime

时间:2017-12-16 14:45:57

标签: c# datetime iis

我正在尝试按日期过滤数据,字段的日期格式为短日期。 我过滤的日期看起来像这个例子'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

如何克服此错误?

由于

1 个答案:

答案 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"
};