Поскольку ваша строка содержит смещение, вам намного лучше разбирать ее на 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. Вы можете столкнуться с трудностями с пользователями других языков.