C # DateTime Parsing - несовместимый формат - PullRequest
0 голосов
/ 05 декабря 2018

У меня есть пример строки даты / времени, которую мне нужно преобразовать в datetimeoffset.

Есть одно огромное несоответствие - если день месяца <10, то между месяцем и днем ​​есть двойной пробел,в противном случае просто один пробел. </p>

Например: 'Tue Dec 4 22:39:38 UTC 2018' и 'Tue Dec 14 22:39:38 UTC 2018'

В настоящее время я анализирую его, используя DateTimeOffset.ParseExact(dateTime, "ddd MMM dd HH:mm:ss UTC yyyy", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal), что не удается для дат, когда день <10 с ошибкой:</p>

FormatException: String 'Tue Dec  4 22:52:42 UTC 2018' was not recognized as a valid DateTime.

Я знаю, что могу искать и заменять символ двойного пробела одним пробелом, но есть ли более элегантный способ добиться этого с помощью строки формата?

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

Для этого и используются флаги DateTimeStyles.Allow*: они инструктируют синтаксический анализатор игнорировать пробелы в строке даты.

В вашем случае строка начинается с сокращенного названия дня недели, поэтому флаг минимально достаточен для игнорированиядополнительный пробел в случае однозначного номера дня:

DateTimeStyles.AllowInnerWhite

Этот и другие флаги задокументированы здесь: https://docs.microsoft.com/en-us/dotnet/api/system.globalization.datetimestyles?view=netframework-4.7.2

0 голосов
/ 05 декабря 2018

К этому вопросу, похоже, было несколько комментариев (включая мой собственный ошибочный вопрос об использовании AllowLeadingWhite (я имел в виду AllowInnerWhite).

Однако, просто используя AllowInnerWhite с существующей строкой формата все ещевыдает ошибку:

Console.WriteLine(DateTimeOffset.ParseExact("Tue Dec  4 22:39:38 UTC 2018", "ddd MMM dd HH:mm:ss UTC yyyy", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal | DateTimeStyles.AllowInnerWhite));

Производит:

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

Однако, глядя на это изпод другим углом, почему бы не изменить сам формат даты, чтобы разрешить однозначные даты. Используйте "ddd MMM d HH:mm:ss UTC yyyy" (с одной буквой «d» для фактической даты вместо «dd»):

Console.WriteLine(DateTimeOffset.ParseExact("Tue Dec  4 22:39:38 UTC 2018", "ddd MMM d HH:mm:ss UTC yyyy", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal | DateTimeStyles.AllowInnerWhite));
Console.WriteLine(DateTimeOffset.ParseExact("Tue Dec 11 22:39:38 UTC 2018", "ddd MMM d HH:mm:ss UTC yyyy", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal | DateTimeStyles.AllowInnerWhite));
Console.WriteLine(DateTimeOffset.ParseExact("Fri Dec 14 22:39:38 UTC 2018", "ddd MMM d HH:mm:ss UTC yyyy", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal | DateTimeStyles.AllowInnerWhite));

Примечаниечто ваши примерные данные 'Tue Dec 14 22:39:38 UTC 2018' потерпят неудачу, потому что 14 декабря 2018 года - пятница, а не вторник.

...