У меня есть проблема, где определенная строка времени, содержавшаяся в Atom-ленте Gmail, не анализирует использование DateTime.Parse()
. Я понимаю, что мог использовать DateTime. TryParse (), но мне любопытно к тому, почему эти два не работают, где, поскольку все остальные делают.
2009-12-28T24:11:48Z
2009-12-30T24:16:20Z
определенное исключение:
Система. FormatException: DateTime, представленный строкой, не поддерживается в системе календаря. Глобализация. GregorianCalendar.
Мое подозрение - то, что это из-за часа 24..., а не 00, но я не уверен, как я исправил бы это.
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;
}
Если это просто 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);
}
Запись DateTime в MSDN говорит, что она поддерживает ISO 8601, что позволяет как 24, так и 00. Она должна позволять формат типа [YYYY][MM][DD]T[hh][mm]Z
, например 2010-01-04T14:04Z
.
Полночь является особым случаем и может быть именуемый как "00:00", так и "00:00". "24:00". Используется обозначение "00:00". в начале календарного дня и используется чаще. В в конце дня использовать "24:00". Обратите внимание, что "2007-04-05T24:00" - это то же самое мгновение. как "2007-04-06T00:00" (см. Комбинированные представление даты и времени ниже).
Та же идея, что и 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
)
Вам все равно нужно будет проверить, правильна ли дата.
.оказалось, что Google использует стандарт даты и времени w3c: http://www.w3.org/TR/NOTE-datetime, какой c# не поддерживает? странно, но не так уж и странно.
этот проект, похоже, реализует это для вас.
http://www.codeproject.com/KB/cs/w3cdate.aspx
edit: yes, I see now that google's not doing it right, but there's a exception for that in the w3cdate c# structure.