Как разобрать строку UT C как DateTime? - PullRequest
0 голосов
/ 22 января 2020

Сегодня API изменил и сломал этот устаревший код со следующей ошибкой:

[System.FormatException: String was not recognized as a valid DateTime.]

Новая дата принимает эту форму: 2020-01-16T14:29:17.9743131Z0.

public static void Main()
{
    var result = "2020-01-16T14:29:17.9743131Z0";
    Console.WriteLine("dateTime : {0}", result);
    Console.WriteLine("result : {0}", Convert.ToDateTime(result));
}

Попробуйте онлайн

Ни Официальная документация DateTime.Parse , ни Официальная документация DateTime.ParseExact поможет мне насколько я пытался на тот момент. Давайте спросим inte rnet.

Я искал в Интернете и нашел Как создать. NET DateTime из формата ISO 8601 . Первое решение с DateTime.Parse и DateTimeStyles.RoundtripKind, но не удалось с той же ошибкой. Второе решение использует DateTime.ParseExact, пользовательские форматы и DateTimeStyles.None. 18 форматов. Ни один не работает . Третий полагается на флаг DateTimeStyles.AssumeUniversal. Это не сработало.

Я также проверяю другую ссылку ( С учетом объекта DateTime, как получить дату ISO 8601 в строковом формате? ) без успеха.

Как мне справиться с этим форматом?

Ответы [ 2 ]

2 голосов
/ 22 января 2020

Вы были близки. Поиск немного больше дал бы эти две ссылки c# преобразовать объект даты и времени в строку ISO 8601 и Как анализировать и генерировать объекты DateTime в формате ISO 8601 . Они не решают вашу проблему как таковую, но дают вам больше информации об этих надоедливых десятичных числах в вашем формате: "fff" Вы можете найти его в Пользовательские строки формата даты и времени . Мы хотим, чтобы "FFFFFFF" особенно соответствовал вашему вводу.

screenshot of the doc

Наш формат может выглядеть следующим образом "yyyy-MM-dd'T'HH:mm:ss.fffffff" Мы можем попробуйте онлайн , но * спойлер * это не сработает. Нам не хватает "Z0" в конце. Хорошие новости, мы можем их игнорировать .

enter image description here

Окончательный код:

public static void Main()
{
    var result = "2020-01-16T14:29:17.9743131Z0";
    Console.WriteLine(result);          

    var format = "yyyy-MM-dd'T'HH:mm:ss.fffffffZ0";
    Console.WriteLine(DateTime.ParseExact(result, format, CultureInfo.InvariantCulture).ToString());
}

Попробуйте онлайн

Обратите внимание, что этот код не будет работать, если в вашей строке меньше 7 знаков после запятой. В конце концов, возможно, вам стоит положиться на решение @jgauffin.

1 голос
/ 22 января 2020

Эта строка соответствует стандарту, за исключением последнего 0.

"Z" обозначает Всемирное координированное время (UT C). После него не должно быть номера, так что вы можете спокойно проигнорировать лишние 0.

var dateStr = "2020-01-16T14:29:17.9743131Z0";

var pos = dateStr.IndexOf('Z');
if (pos != -1 && pos < dateStr.Length - 1)
    dateStr = dateStr.Remove(pos + 1);

var date = DateTime.Parse(dateStr);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...