C# 将错误的日期字符串转换为最近的有效字符串
例如,我有2017年9月31日(这是不存在的日期)和该字符串的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,然后确保每个部分都在正确的范围内,然后创建新的字符串进行分析。我怀疑您只需
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(年,月))代码>给出当前情况下我想要的结果:上个月的最后一天,以防日期不正确。谢谢。这只是一个想法,你可以根据自己的需要扩展并提高效率。