«Пн Окт 07 2019 00:00:00 GMT-0400» не был признан действительным DateTime - PullRequest
1 голос
/ 23 января 2020

Я пытаюсь разобрать эту дату в DateTime, но я получил эту ошибку

Ср 15 января 2020 00:00:00 GMT-0400 'не был распознан как действительный DateTime

// dateRange = ""Mon Oct 07 2019 00:00:00 GMT-0400 (Eastern Daylight Time)Sat Nov 23 2019 00:00:00 GMT-0500 (Eastern Standard Time)";

string start = dateRange.Substring(0, 34);//"Mon Oct 07 2019 00:00:00 GMT-0400"


DateTime startDateTime = DateTime.ParseExact(start, "ddd MMM dd yyyy HH:mm:ss 'GMT'K", System.Globalization.CultureInfo.InvariantCulture);

Ответы [ 3 ]

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

В вашей логике есть небольшая ошибка c. Подстрока должна занимать 33 символа, а не 34, поскольку 34-й символ является следующим пробелом:

// string start = dateRange.Substring(0, 34);  // "Wed Jan 08 2020 00:00:00 GMT-0500 "
   string start = dateRange.Substring(0, 33);  // "Wed Jan 08 2020 00:00:00 GMT-0500"
0 голосов
/ 24 января 2020

Поскольку ваша строка содержит смещение, вам намного лучше разбирать ее на DateTimeOffset со спецификатором zzz, чем на DateTime со спецификатором K.

Проблема с K означает, что если присутствует любое смещение цифра c, то тип будет рассматриваться как DateTimeKind.Local, а часть значения даты и времени будет скорректирована с предоставленного смещения на местный часовой пояс. Вы, вероятно, не хотите такого поведения.

string dateRange = "Mon Oct 07 2019 00:00:00 GMT-0400 (Eastern Daylight Time)Sat Nov 23 2019 00:00:00 GMT-0500 (Eastern Standard Time)";

string[] parts = dateRange.Split('(',')');

string format = "ddd MMM dd yyyy HH:mm:ss 'GMT'zzz";

DateTimeOffset start = DateTimeOffset.ParseExact(parts[0].Trim(), format, CultureInfo.InvariantCulture);
DateTimeOffset end = DateTimeOffset.ParseExact(parts[2].Trim(), format, CultureInfo.InvariantCulture);

Console.WriteLine(start.ToString("o"));  // 2019-10-07T00:00:00.0000000-04:00
Console.WriteLine(end.ToString("o"));    // 2019-11-23T00:00:00.0000000-05:00

Рабочий пример здесь

Кроме того, если бы я предположил, я бы сказал, что этот формат был создан путем объединения вывод двух JavaScript Date объектов в браузере (либо через toString явно, либо просто неявно). Это верно? Если это так, вам, вероятно, не следует отправлять этот формат на сервер, а вместо этого вызывать .toISOString(), чтобы получить строку в формате ISO 8601 на основе UT C, или использовать такую ​​функцию, как this получить строку в формате ISO 8601, основанную на местном времени пользователя. Любой вывод - намного лучший выбор для анализа в вашем. Net коде, чем строки, читаемые человеком, которые вы используете в настоящее время.

Одна из действительно веских причин сделать это состоит в том, что "Mon" и "Oct" допустимы сокращения в Engli sh. Вы можете столкнуться с трудностями с пользователями других языков.

0 голосов
/ 24 января 2020

Добро пожаловать в StackOverflow.

Я собираюсь предложить немного другой подход, используя. NET регулярные выражения. ( здесь ссылка на синтаксис регулярного выражения )

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

string strRegex = @"(?<startDate>(.*\s*).*)\((?<startZone>.*)\)(?<endDate>(.*\s*).*)\((?<endZone>.*)\)";
Regex myRegex = new Regex(strRegex, RegexOptions.Multiline | RegexOptions.Singleline);
string dateRange = @"Wed Jan 08 2020 00:00:00 GMT-0500 (Eastern Standard Time)Sat Jan 25 2020 00:00:00 GMT-0500 (Eastern Standard Time)";

Match myMatch = myRegex.Match(dateRange);

string startDate = myMatch.Groups["startDate"].Value;
string endDate = myMatch.Groups["endDate"].Value;
Console.WriteLine(startDate);
Console.WriteLine(endDate); 

Вот вывод:

Wed Jan 08 2020 00:00:00 GMT-0500 
Sat Jan 25 2020 00:00:00 GMT-0500
...