C# 将错误的日期字符串转换为最近的有效字符串

C# 将错误的日期字符串转换为最近的有效字符串,c#,.net,date,C#,.net,Date,例如,我有2017年9月31日(这是不存在的日期)和该字符串的DateTime.ParseExact(“2017年9月31日”,“dd.MM.yyyy”,null)返回系统.FormatException异常。是否有办法将2017年9月31日变为2017年9月30日,并对所有此类错误日期执行相同操作?例如,像“round”这样的操作:移动到上个月的最后一天或下个月的第一天。结果可能不可预测,但您可以拆分部分,转换为int,然后确保每个部分都在正确的范围内,然后创建新的字符串进行分析。我怀疑您只需

例如,我有2017年9月31日(这是不存在的日期)和该字符串的
DateTime.ParseExact(“2017年9月31日”,“dd.MM.yyyy”,null)返回
系统.FormatException
异常。是否有办法将2017年9月31日变为2017年9月30日,并对所有此类错误日期执行相同操作?例如,像“round”这样的操作:移动到上个月的最后一天或下个月的第一天。

结果可能不可预测,但您可以拆分部分,转换为int,然后确保每个部分都在正确的范围内,然后创建新的字符串进行分析。我怀疑您只需要对前两个零件(dd和MM)执行此操作如果超出范围,则只需将其设置为最接近的边界值。

您可以编写一个,并将其与
日期时间一起使用。ParseExact
但是它可能无法跨区域性工作,并且可能仍会引发异常,例如
日历系统不支持字符串表示的日期时间。全球化。GregorianCalendar.
关于如何实施

DateTime.ParseExact Method (String, String, IFormatProvider)

a.

您可以使用以下技术:

DateTime temp;
if (!DateTime.TryParse("31.09.2017", out temp))
    temp = GetValidDate("31.09.2017");

DateTime GetValidDate(string _date)
{
    int day, year, month;
    day = int.Parse(_date.Substring(0, 2));
    month = int.Parse(_date.Substring(3, 2));
    year = int.Parse(_date.Substring(6, 4));

    return new DateTime(year, month, Math.Min(day, DateTime.DaysInMonth(year, month)));
}

我明白了。。我只是想知道,也许有一些现成的包或扩展方法可以用于这种情况。在C中,有
mktime
,这是第三种选择:例如,9月40日被计算为9月30日后的10天。我不知道有哪些C#库实现了这一点,但如果有,最好说明这是否可以。这似乎是我的解决方案。我只想在一些合理的条件下把不正确的日期改成正确的日期。。例如,45.324.43在我想象的情况下是错误的,但40.09.2017应该像你所说的那样工作。我想我会坚持你建议的解决方案,稍微改变一下解析。部分
newdatetime(年,月,数学.Min(天,DateTime.DaysInMonth(年,月))给出当前情况下我想要的结果:上个月的最后一天,以防日期不正确。谢谢。这只是一个想法,你可以根据自己的需要扩展并提高效率。