2015-09-28 6 views
2

Мне нужны синтаксические разборки datetimeoffsets из строк из нескольких форматов. Одна из строк, которые не является: 08/12/1992 07.00.00 -05: 00Разбор строки DateTimeOffset в C#

Теперь, когда я пытаюсь разобрать это, я использую:

DateTimeOffset.ParseExact("08/12/1992 07.00.00 -05:00", "dd/MM/yyyy HH:mm:ss zzz", CultureInfo.InvariantCulture) 

Который дает FormatException:

«Строка не была признана действительной DateTime».

Я также могу попытаться добавить разделители в сепараторах:

DateTimeOffset.ParseExact("08/12/1992 07.00.00 -05:00", "dd'/'MM'/'yyyy HH':'mm':'ss zzz", CultureInfo.InvariantCulture) 

... или другие перестановки малого/буквы или разделителей, но я получаю ту же ошибку.

Может ли кто-нибудь сказать мне, почему строки ParseExact выше не работают, и как их исправить?

EDIT: Я попытался использовать запрос LINQ, чтобы заменить двоеточие на точки (: ->.). По-видимому, это не сработало правильно - спасибо за ответы.

+0

Это не похоже на временную строку даты инварианта культуры. – juharr

ответ

5

Фактическая дата (на самом деле время) строка разграничивает часы от минуты от секунд с точкой ., так что ваш формат должен сделать то же самое:

DateTimeOffset.ParseExact("08/12/1992 07.00.00 -05:00", 
    "dd/MM/yyyy HH.mm.ss zzz", CultureInfo.InvariantCulture) 
//    ^^ 
//    | | 

Если у вас есть несколько форматов строк в ваших данных , вы можете сделать что-то вроде этого:

public static DateTimeOffset Parse(string str) 
    { 
     string[] formats = 
     { 
      "dd/MM/yyyy HH.mm.ss zzz", 
      "dd/MM/yyyy HH:mm:ss zzz" 
      // ... possibly more ... 
     }; 

     var dto = new DateTimeOffset(); 
     if (!formats.Any(f => DateTimeOffset.TryParseExact(str, f, CultureInfo.InvariantCulture, DateTimeStyles.None, out dto))) 
     { 
      throw new ArgumentException("Unrecognized date format"); 
     } 

     return dto; 
    } 
1

В заявлении

DateTimeOffset.ParseExact("08/12/1992 07.00.00 -05:00", 
          "dd/MM/yyyy HH:mm:ss zzz", 
          CultureInfo.InvariantCulture) 

строка формата использует : как разделитель для временных частей, но аргумент данных использует . в качестве разделителя.

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

  • Нет связанных вопросов^_^