1

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

  • 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
我在输入日期字符串之后以明文形式添加了实际日期。

UPDATE #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

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

4

6 回答 6

2

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

请参阅MSDN

于 2011-12-14T16:45:07.217 回答
2

根据评论更新:

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
于 2011-12-14T17:06:54.893 回答
0

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

于 2011-12-14T16:40:08.997 回答
0

我不相信您需要匹配 1 到 4 个字符但 2 或 4 个字符的年份。

对于这个例子

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

你需要类似的东西

d-MM-yyTHH':'mm':'sszzz

于 2011-12-14T16:41:09.997 回答
0

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

于 2011-12-14T16:41:20.637 回答
0

既然你知道你必须支持多种格式,我建议你使用 TryParseExact 方法。

如果使用一种格式解析失败(即返回 false),则尝试下一种格式。

于 2011-12-14T16:58:10.627 回答