Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 转换时拆分日期时间字符串_C#_Parsing_Datetime - Fatal编程技术网

C# 转换时拆分日期时间字符串

C# 转换时拆分日期时间字符串,c#,parsing,datetime,C#,Parsing,Datetime,我正在编写一个C#类,它将字符串转换为日期。我想这很容易。该类接受格式字符串(如“yyyy-MM-dd”)和输入字符串(如“2010-10-10”) 但是,我有一些案例给我带来了麻烦: format "yyyyMMdd" input "19950000" 或 请注意,这些情况下的日期和/或月份为零('00'),不能转换为日期时间。我需要更换它们 为了处理这些情况,我需要将输入字符串分为几部分,分别是日、月和年,这样如果缺少,我就可以设置一些默认的日和月(可能是01)。但我需要使用formats

我正在编写一个C#类,它将字符串转换为日期。我想这很容易。该类接受格式字符串(如“yyyy-MM-dd”)和输入字符串(如“2010-10-10”)

但是,我有一些案例给我带来了麻烦:

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);