2014-11-12 2 views
1

Эта строка генерируется приложением, которое я пытаюсь отлаживать. DateTime.Parse работает, но DateTime.ParseExact нет. Сохраняет исключение для плохого формата.Что случилось с этой строкой DateTime?

// test 
string dateTimeFormatted = "2014-11-10T14:49:24-06:00"; 

try 
{ 
    //yyyy-MM-ddTHH:mm:sszzz 2014-11-10T14:49:24-06:00 
    DateTime myDate = DateTime.ParseExact(dateTimeFormatted, 
       "yyyy-MM-ddTHH:mm:sszzz", System.Globalization.CultureInfo.InvariantCulture, DateTimeStyles.None); 
       return myDate; 
      } 
      catch (Exception) 
      { 
       try 
       { 
        // This works 
        DateTime myDate2 = DateTime.Parse(dateTimeFormatted); 

        return myDate2; 
       } 
       catch (Exception) 
       { 

        throw; 
       } 
      } 

Edit:

Это последний метод, который я написал, что, кажется, работает безупречно. Поскольку метод вызывается вскоре после того, как приложение генерирует эту метку времени, оно будет просто использовать Datetime.Now, если оба DateTime.ParseExact и DateTime.Parse терпят неудачу.

public DateTime GetDateTimeFromFormattedString(string dateTimeFormatted) 
{ 
    try 
    { 
     //test data 2014-11-10T14:49:24-06:00 
     DateTime myDate; 
     bool bIsParsed = DateTime.TryParseExact(dateTimeFormatted.Trim(), 
      "yyyy'-'MM'-'dd'T'HH':'mm':'sszzz", System.Globalization.CultureInfo.InvariantCulture, DateTimeStyles.None, out myDate); 
     if (bIsParsed) 
      return myDate; 
     else 
      bIsParsed = DateTime.TryParse(dateTimeFormatted.Trim(), out myDate); 

     if (bIsParsed) 
      return myDate; 
     else 
      return DateTime.Now; 
    } 
    catch (Exception e) 
    { 
     Console.WriteLine(e.StackTrace); 
     return DateTime.Now; 
    } 
} 

Другой редактировать:

Это тоже работает

 DateTimeOffset dto; 
     bool bIsParsed = DateTimeOffset.TryParseExact(dateTimeFormatted.Trim(), "yyyy-MM-ddTHH:mm:sszzz", 
          System.Globalization.CultureInfo.InvariantCulture, 
          DateTimeStyles.AdjustToUniversal, out dto); 
     if (bIsParsed) 
      return dto.DateTime; 
+0

Примечание стороны: используйте «TryParseExact» и «TryParse» вместо исключения исключений. –

+2

[Код, который вы предоставили мне для работы] (http://ideone.com/ctM8IJ). – CodeCaster

+0

Да, это работает и здесь. Видя, как вы из США, я сомневаюсь, что это какая-то экзотическая культура, поэтому я не могу не предполагать, что это что-то не имеет к этому отношения. –

ответ

2

Попробуйте добавить кавычки вокруг определенных символов в строке формата:

DateTime myDate = DateTime.ParseExact(dateTimeFormatted, 
       "yyyy'-'MM'-'dd'T'HH':'mm':'sszzz", System.Globalization.CultureInfo.InvariantCulture, DateTimeStyles.None); 
+0

Вот и все. Благодарю. – gmlacrosse

+0

Добро пожаловать. Уже ударился головой о стену по этому вопросу в прошлом :) – LittleSweetSeas

+0

В каких случаях это необходимо? – Andrew

1

Ваш код не бросает FormatException. Но я бы хотел, чтобы это было возможно.

Прежде всего, не используйте "zzz" custom format specifier на DateTime разбор. Это не рекомендуется. Поскольку DateTime не хранит любое значениеUTC Offset, нет смысла использовать его.

Из документации;

Со значениями DateTime, то «ZZZ» пользовательский формат спецификатор представляет подписал смещение часового пояса локальной операционной системы от UTC, , измеренном в часах и минутах. Он не отражает значение свойства DateTime.Kind экземпляра объекта . По этой причине спецификатор «zzz» не рекомендуется использовать с значениями DateTime.

Если строка компенсировали часть, было бы лучше, чтобы разобрать его DateTimeOffset вместо DateTime.

С тех пор как вы используете DateTimeStyles.None, это проанализирует вашу строку как Local. Это означает, что он добавляет ваше текущее значение смещения часового пояса к вашему результату.

Например, я живу в Turkey и теперь ваш часовой пояс UTC +02:00. Вот почему, если я использую DateTimeStyles.None так же, как вы, часть времени результата будет 22:49:24 не 20:49:24. Если я использую DateTimeStyles.AdjustToUniversal, это будет 20:49:24.

Здесь a DateTimeOffset синтаксический анализ;

string s = "2014-11-10T14:49:24-06:00"; 
DateTimeOffset dto; 
if(DateTimeOffset.TryParseExact(s, "yyyy-MM-ddTHH:mm:sszzz", 
           CultureInfo.InvariantCulture, 
           DateTimeStyles.AdjustToUniversal, out dto)) 
{ 
    Console.WriteLine(dto.DateTime) // 10/11/2014 20:49:24 
} 
+1

Спасибо. Это полезный совет. – gmlacrosse

Смежные вопросы