尝试使用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”未被识别为有效的日期时间

SQLite 和 .net 字符串未被识别为有效的 DateTime

Angular CLI 'ng' 未被识别为有效命令

JSON.NET:字符串 '7/1/20 14:15' 未被识别为有效的 DateTime