Как создать a.NET дата и время из формата ISO 8601
Я нашел, как превратить DateTime в ISO 8601 формат, но ничего о том, как сделать обратное В C#.
у меня есть 2010-08-20T15:00:00Z
и я хочу превратить его в
7 ответов:
Это решение использует DateTimeStyles перечисление, и он также работает с З.
DateTime d2 = DateTime.Parse("2010-08-20T15:00:00Z", null, System.Globalization.DateTimeStyles.RoundtripKind);
это печатает решение отлично.
using System.Globalization; DateTime d; DateTime.TryParseExact( "2010-08-20T15:00:00", "s", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal, out d);
хотя 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-less strings (I do), вы можете добавить строку "s", чтобы значительно увеличить количество изменений формата.
вот тот, который работает лучше для меня ( LINQPad версия):
DateTime d; DateTime.TryParseExact( "2010-08-20T15:00:00Z", @"yyyy-MM-dd\THH:mm:ss\Z", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal, out d); d.ToString()
производит
true 8/20/2010 8:00:00 AM
представляется важным, чтобы в точности соответствовать формате ISO для
TryParseExact
на работу. Я думаю, что точно точно, и этот ответ очевиден для большинства, но в любом случае...в моем случае, реб.Ответ кабины не работает, так как у меня есть немного другой вход в соответствии с моим "значением" ниже.
значение:
2012-08-10T14:00:00.000Z
есть некоторые дополнительные 000 там в течение миллисекунд, и там может быть больше.
однако, если я добавлю некоторые
.fff
в формат, как показано ниже, все в порядке.Формат Строки:
@"yyyy-MM-dd\THH:mm:ss.fff\Z"
в VS2010 немедленное окно:
DateTime.TryParseExact(value,@"yyyy-MM-dd\THH:mm:ss.fff\Z", CultureInfo.InvariantCulture,DateTimeStyles.AssumeUniversal, out d);
правда
возможно, вам придется использовать
DateTimeStyles.AssumeLocal
а также в зависимости от того, в какой зоне ваше время...