DateTime.Parse问题,不支持System.Globalization.GregorianCalendar

时间:2010-01-04 15:55:02

标签: c# .net datetime

我遇到的问题是Gmail Atom Feed中包含的特定时间字符串未使用DateTime.Parse()进行解析。我知道我可以使用DateTime.TryParse(),但我很好奇为什么这两个不起作用,所有其他人都这样做。

2009-12-28T24:11:48Z
2009-12-30T24:16:20Z

具体例外是:

  

System.FormatException:日历System.Globalization.GregorianCalendar中不支持字符串表示的DateTime。

我怀疑是因为24小时而不是00小时,但我不确定如何纠正这一点。

5 个答案:

答案 0 :(得分:16)

private static DateTime ParseDate(string s)
{
    DateTime result;
    if (!DateTime.TryParse(s, out result))
    {                
        result = DateTime.ParseExact(s, "yyyy-MM-ddT24:mm:ssK", System.Globalization.CultureInfo.InvariantCulture);
        result = result.AddDays(1);
    }
    return result;
}

答案 1 :(得分:2)

如果它只是24而不是00,您可以简单地替换它并添加一天:

String s = "2009-12-28T24:11:48Z";
DateTime dt;
if (s.Contains("T24:")
{
    s = s.Replace("T24:", "T00:");

    if (DateTime.TryParse(s, out dt))
        dt.AddDays(1);
}
else
{
    DateTime.TryParse(s, out dt);
}

答案 2 :(得分:1)

使用w3c日期和时间标准:http://www.w3.org/TR/NOTE-datetime,而c#不支持?奇怪,但不是那么奇怪。

这个项目似乎是为你实现的。

http://www.codeproject.com/KB/cs/w3cdate.aspx

编辑:是的,我现在看到谷歌没有做到这一点,但在w3cdate c#结构中有一个例外。

答案 3 :(得分:1)

The DateTime entry in MSDN表示它支持允许24和00的ISO 8601。它应该允许类型[YYYY][MM][DD]T[hh][mm]Z的格式,例如。 2010-01-04T14:04Z

  

午夜是一个特例,可以   被称为“00:00”和   “24:00”。使用符号“00:00”   在一个日历日的开始和   是更常用的。在   一天结束时使用“24:00”。注意   “2007-04-05T24:00”是同一时刻   as“2007-04-06T00:00”(参阅合并   下面的日期和时间表示。

答案 4 :(得分:1)

与md5sum相同,但方式不同:

 DateTime.ParseExact(
  "2009-12-28T24:11:48Z",
  new []{ "yyyy-MM-ddTHH:mm:ssK", "yyyy-MM-ddT24:mm:ssK" }, 
  System.Globalization.CultureInfo.InvariantCulture,
  System.Globalization.DateTimeStyles.None
)

你仍然需要检查日期是否正确。