Разбор строки DateTimeOffset в C#

Мне нужно проанализировать datetimeoffsets из строк нескольких форматов. Одна из неудачных строк: 12.08.1992 07.00.00 -05:00

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

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, чтобы заменить двоеточие точками (: -> .). Видимо что-то не так получилось - спасибо за ответы.


person crutux    schedule 28.09.2015    source источник
comment
Это не похоже на строку даты и времени, инвариантную для культуры.   -  person juharr    schedule 28.09.2015


Ответы (2)


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

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;
    }
person Christian.K    schedule 28.09.2015

В заявлении

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

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

person Codor    schedule 28.09.2015