Я нашел, как преобразовать DateTime в формат ISO 8601 , но не знаю, как сделать обратное в C #.
У меня есть 2010-08-20T15:00:00Z
, и я хочу превратить это в DateTime
объект.
Я мог бы сам разделить части струны, но это кажется большим трудом для того, что уже является международным стандартом.
Ответы:
Это решение использует перечисление DateTimeStyles , а также работает с Z.
Это отлично печатает решение.
источник
DateTime d2= DateTime.Parse("2010-08-20T15:00:00Z", null, DateTimeStyles.RoundtripKind);
похоже, работает хорошо.DateTimeStyles.RoundtripKind?
описание MSDN пусто.2018-06-19T14:56:14.123Z
анализируется как местное время, а не UTC. Я используюCultureInfo.InvariantCulture
вместо null.DateTimeStyles.RoundTripKind
см. Stackoverflow.com/q/39572395/2014893Хотя MSDN утверждает, что форматы «s» и «o» отражают стандарт, похоже, они могут анализировать только его ограниченное подмножество. Особенно проблема, если строка содержит указание часового пояса. (Ни для базовых форматов ISO8601, ни для форматов с пониженной точностью - однако это не совсем ваш случай.) Вот почему я использую строки настраиваемого формата, когда дело доходит до синтаксического анализа ISO8601. В настоящее время мой предпочтительный фрагмент:
Если вы не возражаете против синтаксического анализа строк без TZ (я так и поступаю), вы можете добавить строку «s», чтобы значительно увеличить количество изменяемых форматов.
источник
"yyyyMMdd"
вformats
массив для уменьшения точности до дней, так как это иногда бывает, когда RFC 5545 RRULE будет полагаться на DTSTART для предоставления времени.K
позволяет объединить различные обработки часовых поясов. У меня есть более обширный вариант на stackoverflow.com/a/31246449/400547, но он, если что-то слишком обширный (принимает материалы, действующие в соответствии с ISO 8601, но не используемые в более распространенных профилях), но он показывает, какK
можно уменьшить размер на третий.источник
Вот тот, который мне больше подходит ( версия LINQPad ):
производит
источник
Кажется важным точно соответствовать формату строки ISO для
TryParseExact
работы. Я думаю, что Exact is Exact, и этот ответ очевиден для большинства, но в любом случае ...В моем случае ответ Reb.Cabin не работает, так как у меня немного другой ввод в соответствии с моим «значением» ниже.
Стоимость:
2012-08-10T14:00:00.000Z
Там несколько лишних 000 за миллисекунды, а может быть и больше.
Однако, если я добавлю немного
.fff
в формат, как показано ниже, все будет в порядке.Строка формата:
@"yyyy-MM-dd\THH:mm:ss.fff\Z"
В немедленном окне VS2010:
правда
Возможно, вам также придется использовать,
DateTimeStyles.AssumeLocal
в зависимости от того, в какой зоне ваше время ...источник
AssumeUniversal
наAdjustToUniversal
.Это отлично работает в LINQPad4:
источник
DateTime.ParseExact(...)
позволяет вам сообщить парсеру, что представляет каждый символ.источник