DateTime.Parse проблема, не поддерживается в System.Globalization.GregorianCalendar - PullRequest
7 голосов
/ 04 января 2010

У меня проблема с тем, что определенная строка времени, содержащаяся в фиде Gmail Atom, не анализируется с использованием DateTime.Parse(). Я понимаю, что мог бы использовать DateTime.TryParse (), но мне любопытно, почему эти два не работают, где, как и все остальные, делают.

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

конкретное исключение:

System.FormatException: DateTime, представленный строкой, не поддерживается в календаре System.Globalization.GregorianCalendar.

Я подозреваю, что это из-за 24 часа ... а не 00, но я не уверен, как бы это исправить.

Ответы [ 5 ]

16 голосов
/ 04 января 2010
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;
}
2 голосов
/ 04 января 2010

Если это просто 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);
}
1 голос
/ 04 января 2010

Та же идея, что и у 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
)

Вам все равно нужно проверить правильность даты.

1 голос
/ 04 января 2010

Запись DateTime в MSDN говорит о том, что она поддерживает ISO 8601 , что позволяет использовать как 24, так и 00. Это должно разрешать формат типа [YYYY][MM][DD]T[hh][mm]Z например 2010-01-04T14:04Z.

Полночь является особым случаем и может быть упоминается как "00:00" и "24:00". Обозначение "00:00" используется в начале календарного дня и чаще используется. На конец дня используйте «24:00». Обратите внимание, что «2007-04-05T24: 00» - это то же самое мгновение как "2007-04-06T00: 00" (см. Комбинированный дата и время представлены ниже).

1 голос
/ 04 января 2010

Оказывается, Google использует стандарт даты и времени w3c: http://www.w3.org/TR/NOTE-datetime,, который c # не поддерживает? странно, но не так странно.

Этот проект, кажется, реализует это для вас.

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

edit: да, теперь я вижу, что Google делает это неправильно, но есть исключение в структуре w3cdate c #.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...