linq string datetime,between和字符串格式异常错误

时间:2013-10-08 02:15:16

标签: c# linq linq-to-sql linq-to-objects

我正在访问google books api以访问他们的记录。问题是他们将发布日期作为字符串。除了字符串,他们有12月6日,6月等记录,这些记录不是有效的日期时间。现在我想在下面的例子中选择两个日期之间的有效日期之间的记录。我可以这样做吗?

        List<datetest> datetest = new List<datetest>();
        datetest.Add(new datetest { stringdate = "13-june" });
        datetest.Add(new datetest { stringdate = "June" });
        datetest.Add(new datetest { stringdate = "2010-09-11" });
        datetest.Add(new datetest { stringdate = "2010-09-10" });
        datetest.Add(new datetest { stringdate = "2014-09-09" });

我已经尝试过date.parse和parseexact,它与格式无关。我不确定tryparse。我怎样才能使它在linq查询中工作。还有别的吗?

3 个答案:

答案 0 :(得分:4)

基于这个答案  How to I use TryParse in a linq query of xml data?

Func<string, DateTime?> tryToGetDate = value =>
{
    DateTime dateValue;
    return DateTime.TryParse(value, out dateValue)
        ? (DateTime?) dateValue
        : null;
};

var dates = (
    from c in datetest
    where tryToGetDate(c.stringdate) != null
    select c
).ToList();

答案 1 :(得分:1)

这将为您提供所有有效日期:

var dates = datetest.Select(x =>
    {
        DateTime date;
        if (DateTime.TryParse(x.stringdate, out date))
            return date;

        return (DateTime?)null;
    }).Where(x => x.HasValue).ToList();

如果您想将无效日期包含为空,则可以删除.Where条件。

另请注意,13-june将被假定为当前年份。

答案 2 :(得分:0)

您必须为每种格式编写单独的条件。基本上,尝试DateTime.Parse它,如果失败,尝试对每个可能需要解析的格式进行评估。

如果您只想将无效日期替换为null,请为每个值执行以下操作:

DateTime Out = null;
DateTime.TryParse("YourString",out Out);

例如,如果您有一个字符串数组(称为Array):

DateTime?[] Result = Array.Select(x => 
{
    DateTime Out = null;
    DateTime.TryParse("YourString",out Out);
    return Out;
}).ToArray();