我正在编写一个将字符串转换为日期的C#类。我觉得很容易。该类接受格式字符串,如“yyyy-MM-dd”和输入字符串,如“2010-10-10”
但是我有些情况会给我带来麻烦:
format "yyyyMMdd" input "19950000"
或
format "dd-MM-yyyy" input "00-06-2001"
请注意,这些情况的日期和/或月份为零('00'),并且这些情况无法转换为DateTime。我需要更换它们。
要处理这些情况,我需要在部分中分割输入字符串,分别为日,月和年各一个,因此如果缺少,我可以设置一些默认的日期和月份(可能是01)。但我需要使用formatstring来实现这一目标。
所以问题是,如何在formatstring中指定的组件中拆分inputtring?
由于
[更新]使用Joe的回答我想出了这个:
string[] formats = { format, format.Replace("dd", "00").Replace("MM", "00"), format.Replace("dd", "00"), format.Replace("MM", "00") };
// Parse input
DateTime d = DateTime.ParseExact(txtDate.Text, formats, CultureInfo.InvariantCulture, DateTimeStyles.None);
这使用提供的格式,并为日,月以及日和月创建带零('00')的替代格式。
谢谢乔!
答案 0 :(得分:3)
我的方法是定义各种正则表达式并使用责任链设计模式,将值传递给第一个,如果匹配则停在那里,如果不匹配则发送到下一个,直到其中一个匹配字符串。 / p>
我的正则表达式模式会分隔日期,月份和年份元素,如果它为0,则为每个元素设置一个默认值。
此处为责任链模式: http://en.wikipedia.org/wiki/Chain-of-responsibility_pattern
private const string Pattern_dd-mm-yyyy = "(\d\d)-(\d\d)-(\d){4}";
private const string Pattern_ddmmyyyy = "(\d\d)(\d\d)(\d){4}";
private const string Pattern_ddSlashmmSlashyyyy = "(\d\d)/(\d\d)/(\d){4}";
答案 1 :(得分:3)
如果您有一组明确定义的格式,则可以使用DateTime.ParseExact
,传递一组格式字符串。
// Define all allowed formats
string[] formats = { "yyyyMMdd", "yyyyMM00", "yyyy0000" };
// Parse input
DateTime d;
d = DateTime.ParseExact("20100930", formats,
CultureInfo.InvariantCulture, DateTimeStyles.None);
d = DateTime.ParseExact("20100900", formats,
CultureInfo.InvariantCulture, DateTimeStyles.None);
d = DateTime.ParseExact("20100000", formats,
CultureInfo.InvariantCulture, DateTimeStyles.None);
缺少的天数/月数将设置为默认值1。
答案 2 :(得分:1)
我不完全理解你的问题(我没有代表发表评论),但我仍然可以给你一些建议。
首先,DateTime类提供了一个ParseExact方法(http://msdn.microsoft.com/en-us/library/w2sa9yss(v=VS.80).aspx),该方法接受日期和格式字符串时间。您可以将格式字符串传递给它
我没有清楚地了解有关案例的部分:您是否需要接受多种格式的时间戳?如果是这样,你可以尝试/ catch,直到你找到一个匹配,或使用TryParseExact方法循环,它几乎一样。
获得DateTime值后,使用Year,Month和Day属性获取您在输入字符串中搜索的组件