我遇到的问题是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小时,但我不确定如何纠正这一点。
答案 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
)
你仍然需要检查日期是否正确。