我需要解析可能采用“ddMMyyyy”格式以及标准GB英语格式的日期(例如“dd / mm / yyyy”),并且我正在尝试使用DateTime.TryParse()
这样做的方法,但它不能识别“ddMMyyyy”格式。
我知道我可以使用Date.TryParseExact()
并且每次都指定自定义格式,但这意味着对每个日期进行两次检查(一种用于自定义格式,一种用于文化的标准格式),它似乎就在那里必须是更好的方式。
有没有办法让DateTime.TryParse()
方法识别自定义日期格式以及标准格式?
答案 0 :(得分:1)
我认为不可能将DateTime.TryParse()
设置为同时识别两种日期格式中的任何一种。查看DateTime.TryParse()
.TryParse(String, DateTime)
和TryParse(String, IFormatProvider, DateTimeStyles, DateTime)
的替换,因此此处的最大灵活性允许您提供可能是IFormatProvider
类的DateTimeFormatInfo
,但是DateTimeFormatInfo
一次只能处理一组格式。
一次尝试(我没试过)将创建一个具有不同LongDatePattern和ShortDatePattern模式的新DateTimeFormatInfo
类(匹配您想要使用的模式),并将该实例作为参数传递给{{ 1}},但用TryParse
检查两次似乎更合理。
答案 1 :(得分:0)
如何使用DateTime.TryParseExact MSDN link
答案 2 :(得分:0)
我担心日期解析器往往不太聪明,主要是设计。虽然您可能想要解析"ddMMyyyy"
日期,但其他人可能想要解析"yyyyMMdd"
日期。在某些情况下,这些可能是相同的("20121220"
是什么?)。解析器很笨,您必须告诉它使用哪种格式。如果您指定多种格式,则需要一次尝试一种格式,这正是您要避免的。
如果你真的只想要一次通过,你可以使用正则表达式来提取相关部分("(?<Day>\d{2})/?(?<Month>\d{2})/?(?<Year>\d{4})"
),然后将其重构为解析器识别的格式(string.Format("{0}/{1}/{2}", match.Groups["Day"].Value, match.Groups["Month"].Value, match.Groups["Year"].Value)
)。 / p>
老实说,在if
语句中使用String.Contains(“/”)可能更有效。