在c#中解析具有可变年长度的精确日期

本文关键字:日期 | 更新日期: 2023-09-27 18:18:04

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

  • 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"

显然这只匹配第二个字符串。今天第一个出现了。现在我们也要匹配它

是否有一个格式字符串来实现这一点?

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

那么现在的问题是什么是正确的解析字符串来解析只有一个数字表示的年份1 ?

在c#中解析具有可变年长度的精确日期

根据注释更新:

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

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

查看MSDN。

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

我不认为你需要匹配1到4个字符的年份,而是2或4个字符。

对于本例

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

你需要像

这样的东西

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

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

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

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