C# 转换时拆分日期时间字符串
我正在编写一个C#类,它将字符串转换为日期。我想这很容易。该类接受格式字符串(如“yyyy-MM-dd”)和输入字符串(如“2010-10-10”) 但是,我有一些案例给我带来了麻烦:C# 转换时拆分日期时间字符串,c#,parsing,datetime,C#,Parsing,Datetime,我正在编写一个C#类,它将字符串转换为日期。我想这很容易。该类接受格式字符串(如“yyyy-MM-dd”)和输入字符串(如“2010-10-10”) 但是,我有一些案例给我带来了麻烦: format "yyyyMMdd" input "19950000" 或 请注意,这些情况下的日期和/或月份为零('00'),不能转换为日期时间。我需要更换它们 为了处理这些情况,我需要将输入字符串分为几部分,分别是日、月和年,这样如果缺少,我就可以设置一些默认的日和月(可能是01)。但我需要使用formats
format "yyyyMMdd" input "19950000"
或
请注意,这些情况下的日期和/或月份为零('00'),不能转换为日期时间。我需要更换它们
为了处理这些情况,我需要将输入字符串分为几部分,分别是日、月和年,这样如果缺少,我就可以设置一些默认的日和月(可能是01)。但我需要使用formatstring来完成这项工作
所以问题是,如何在formatstring中指定的组件中拆分inputstring
谢谢
[更新]根据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,则为每个元素设置一个默认值 以下是责任链模式:
我不完全理解你的问题(我没有代表的意见),但我仍然可以给你一些建议 首先,DateTime类提供了一个ParseExact方法(http://msdn.microsoft.com/en-us/library/w2sa9yss(v=VS.80).aspx),它接受日期和时间的格式字符串。您可以将格式字符串传递给它 我不太清楚关于案例的部分:您需要接受多种格式的时间戳吗?如果是这样,您可以尝试/捕获,直到找到匹配项,或者使用几乎相同的TryParseExact方法进行循环
获得日期时间值后,使用年、月和日属性获取在输入字符串中搜索的组件如果有一组定义良好的格式,可以使用
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。我知道ParseExact。我有一个可以接受多种格式的转换器。现在我明白你的问题了。但问题马上就来了:日/月的00是什么意思?无论如何,如果您只支持上面提到的两种格式,Regex方法就可以了。相反,如果您希望支持yyyyMMdd,例如ddMMyyyy,我认为没有可行的解决方案。在00表示“未知”的情况下,我必须经常处理此类日期。这不是对编程问题的回答,只是一个实际的警告。例如,如果选择将日期位置中的00转换为01,除非保留原始伪日期字符串作为数据行的一部分以供以后参考,否则将无法区分完整日期和“修复”日期。如果您使用“责任链”模式,并且在创建虚假数据时实际丢失了信息,这将是一个讽刺好的,听起来不错。convertor类接受像'dd-MM-yyyy'这样的格式字符串作为输入,有很多变体,因此我需要从这个格式字符串构造正则表达式。很高兴您喜欢它。让我知道进展如何。
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}";
// 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);