Разобрать DateTime из строки c # - PullRequest
4 голосов
/ 06 марта 2019

У меня есть дата, которую я получаю от входящего вызова API: Wed, 6 Mar 2019 14:39:49 +0300

Мне нужно проанализировать эту строку в DateTime. Для этого я использую следующий код:

DateTime.ParseExact("Wed, 6 Mar 2019 14:39:49 +0300", 
                     new string[] { "ddd, dd MMM yyyy HH:mm:ss zzzz" },
                     CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal);

Но в результате у меня ошибка:

Строка 'Ср, 6 марта 2019 14:39:49 +0300' не была признана действительной DateTime.

Что я делаю не так? Как я могу решить это?

Ответы [ 7 ]

12 голосов
/ 06 марта 2019

Я вижу 2 вещи;

  1. Вы должны использовать d спецификатор вместо dd, поскольку ваш однобитный номер дня имеет значение не иметь начальный ноль .
  2. Нет zzzz в качестве спецификатора пользовательского формата.Вместо этого вы должны использовать zzz спецификатор .

DateTime.ParseExact("Wed, 6 Mar 2019 14:39:49 +0300", 
                     new string[] { "ddd, d MMM yyyy HH:mm:ss zzz" },
                     CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal);

Но, честно говоря, если ваши строки имеют смещение UTC *Значение 1026 *, я бы посоветовал разобрать его на DateTimeOffset, поскольку экземпляр DateTime не имеет смещенной части, и использование спецификаторов zzz не рекомендуется, как указано в MSDN.

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

Для анализа DateTimeOffset,

DateTimeOffset.ParseExact("Wed, 6 Mar 2019 14:39:49 +0300", 
                           new string[] { "ddd, d MMM yyyy HH:mm:ss zzz" },
                           CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal);

СейчасВы можете использовать его .DateTime и / или .Offset свойства отдельно, если хотите.

1 голос
/ 19 марта 2019

д МММ гггг вместо ддд ммм гггг

date = DateTime.ParseExact("Wed, 6 Mar 2019 14:39:49 +0300", "ddd, d MMM yyyy HH:mm:ss zzz", CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal);
1 голос
/ 15 марта 2019

Функция Datetime.ParseExact, как показано ниже, поможет вам.Нужно изменить одну вещь: вместо dd MMM yyyy используйте d MMM yyyy.

DateTime.ParseExact("Wed, 6 Mar 2019 14:39:49 +0300", "ddd, d MMM yyyy HH:mm:ss zzz", CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal);
1 голос
/ 06 марта 2019

Возможно, вы ищете

DateTime myDate = DateTime.ParseExact("Wed, 6 Mar 2019 14:39:49 +0300",
                                      "ddd, d MMM yyyy HH:mm:ss zzz",
                                      CultureInfo.InvariantCulture, 
                                      DateTimeStyles.AdjustToUniversal);

См .: https://stackoverflow.com/a/10426999/4373895 Это также поможет вам. Спасибо.

1 голос
/ 06 марта 2019

Измените "ддд, дд ммм гггг чч: мм: сс zzzz" на "ддд, д ммм гггг чч: мм: сс zzzz"

DateTime.ParseExact("Wed, 6 Mar 2019 14:39:49 +0300", 
                     new string[] { "ddd, d MMM yyyy HH:mm:ss zzzz" },
                     CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal);
0 голосов
/ 06 марта 2019
DateTime time = Convert.ToDateTime("Wed, 6 Mar 2019 14:39:49 +0300");
string ti = time.ToString(@"ddd, dd MMM yyyy HH:mm:ss zzzz");
0 голосов
/ 06 марта 2019

Формат смещения UTC - zzz, а не zzzz, и он предполагает наличие двоеточия (:) для отделения часов от минут (например, +03:00).Кроме того, dd предназначен для начального нулевого дня месяца, но у вас есть одна цифра для дня месяца.В этом случае используйте d.

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