具有可变年份长度的c#中的解析日期

时间:2011-12-14 16:37:30

标签: c# datetime format-string

我正在尝试找到适当的格式字符串来解析(确切)以下类型的日期:

  • 1-01-01T00:00:00+00:00 - 0001年1月1日
  • 2011-12-14T15:53:40+00:00 - 2011年12月14日

所以年份长度似乎是可变的(1-4个字符)。

我目前用来解析精确的格式是:
c_DateTimeFormatString = "yyyy-MM-ddTHH':'mm':'sszzz"

显然这只匹配第二个字符串。今天第一个加速了。现在我们必须匹配它。

是否有格式字符串来实现此目的?

更新#1
我在输入日期字符串后以明文添加了实际日期。

更新#2
Parse exact有一个重载,允许传入多个格式字符串。这似乎是正确的方法。

所以第一次尝试是使用:

DateTime.ParseExact("1-01-01T00:00:00+00:00 ", new[] { "yyyy-MM-ddTHH':'mm':'sszzz", "yyy-MM-ddTHH':'mm':'sszzz", "yy-MM-ddTHH':'mm':'sszzz", "y-MM-ddTHH':'mm':'sszzz" }, CultureInfo.CreateSpecificCulture("en-US"), DateTimeStyles.AssumeLocal)

但遗憾的是,这确实给出了正确的结果,第一个日期字符串被解析为:
01.01.2001
而不是 01.01.0001

所以现在的问题是解析第一年的正确解析字符串是什么,仅用一位数表示?

6 个答案:

答案 0 :(得分:2)

我相信你可以使用ParseExact的重载来匹配多种格式。

请参阅MSDN

答案 1 :(得分:1)

根据评论更新:

string y = "yyyy-MM-ddTHH':'mm':'sszzz";

string testDate = "1-01-05T00:00:00+00:00".PadLeft(25, '0');
Console.WriteLine(DateTime.ParseExact(testDate, y, CultureInfo.InvariantCulture));
testDate = "2011-12-14T15:53:40+00:00".PadLeft(25, '0');
Console.WriteLine(DateTime.ParseExact(testDate, y, CultureInfo.InvariantCulture));

输出结果为:

1/5/0001 00:00:00
12/14/2011 15:53:40

答案 2 :(得分:0)

如果输入格式不完全相同,则需要停止使用精确解析,或者根据输入数据的格式使用不同的格式参数调用它。

答案 3 :(得分:0)

我认为您不需要匹配1到4个字符,但需要2到4个字符。

对于这个例子

1-01-05T00:00:00 + 00:00

你需要像

这样的东西

d-MM-yyTHH ':' 毫米 ':' sszzz

答案 4 :(得分:0)

尝试填充字符串,使年份长度为4位数。您应该添加2,20或201而不仅仅是0。

答案 5 :(得分:0)

由于您知道必须支持多种格式,因此我建议您使用TryParseExact方法。

如果使用一种格式无法解析(即返回false),请尝试下一种格式。