Хотя MSDN говорит, что форматы «s» и «o» отражают стандарт, они, похоже, могут анализировать только ограниченное подмножество. Особенно это проблема, если строка содержит спецификацию часового пояса. (Ни для базовых форматов ISO8601, ни для сокращенных прецизионных форматов, но это не совсем так). Именно поэтому я использую строки пользовательского формата, когда дело доходит до разбора ISO8601.В настоящее время мой любимый фрагмент является:
static readonly string[] formats = {
// Basic formats
"yyyyMMddTHHmmsszzz",
"yyyyMMddTHHmmsszz",
"yyyyMMddTHHmmssZ",
// Extended formats
"yyyy-MM-ddTHH:mm:sszzz",
"yyyy-MM-ddTHH:mm:sszz",
"yyyy-MM-ddTHH:mm:ssZ",
// All of the above with reduced accuracy
"yyyyMMddTHHmmzzz",
"yyyyMMddTHHmmzz",
"yyyyMMddTHHmmZ",
"yyyy-MM-ddTHH:mmzzz",
"yyyy-MM-ddTHH:mmzz",
"yyyy-MM-ddTHH:mmZ",
// Accuracy reduced to hours
"yyyyMMddTHHzzz",
"yyyyMMddTHHzz",
"yyyyMMddTHHZ",
"yyyy-MM-ddTHHzzz",
"yyyy-MM-ddTHHzz",
"yyyy-MM-ddTHHZ"
};
public static DateTime ParseISO8601String (string str)
{
return DateTime.ParseExact (str, formats,
CultureInfo.InvariantCulture, DateTimeStyles.None);
}
Если вы не против разбора TZ-менее строк (я), можно добавить строку «S», чтобы значительно расширить число крытых изменений формата.
Возможный дубликат [Преобразование строки в Date в .NET] (http://stackoverflow.com/questions/2188585/convert-string-to-date-in-net) – abatishchev
Искать сначала пожалуйста. Это 100-й вопрос по этому вопросу в этом месяце – abatishchev
@abatishchev no Это не дубликат этого вопроса. Возможно, сначала вы должны прочитать вопрос перед ответом. – Aidin