转换时拆分DateTime字符串

时间:2010-10-10 12:08:12

标签: c# parsing datetime

我正在编写一个将字符串转换为日期的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')的替代格式。

谢谢乔!

3 个答案:

答案 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属性获取您在输入字符串中搜索的组件