He encontrado cómo convertir un DateTime en un formato ISO 8601 , pero nada sobre cómo hacer lo contrario en C #.
Tengo 2010-08-20T15:00:00Z
, y quiero convertirlo en un DateTime
objeto.
Podría separar las partes de la cadena yo mismo, pero eso parece mucho trabajo para algo que ya es un estándar internacional.
Respuestas:
Esta solución hace uso de la enumeración DateTimeStyles y también funciona con Z.
Esto imprime la solución perfectamente.
fuente
DateTime d2= DateTime.Parse("2010-08-20T15:00:00Z", null, DateTimeStyles.RoundtripKind);
parece funcionar bien.DateTimeStyles.RoundtripKind?
descripción de MSDN está en blanco.2018-06-19T14:56:14.123Z
se analiza como hora local, no UTC. Yo uso enCultureInfo.InvariantCulture
lugar de nulo.DateTimeStyles.RoundTripKind
, consulte stackoverflow.com/q/39572395/2014893Aunque MSDN dice que los formatos "s" y "o" reflejan el estándar, parecen ser capaces de analizar solo un subconjunto limitado del mismo. Especialmente es un problema si la cadena contiene la especificación de zona horaria. (Tampoco lo hace para formatos básicos ISO8601 o formatos de precisión reducida; sin embargo, este no es exactamente su caso). Es por eso que utilizo cadenas de formato personalizadas cuando se trata de analizar ISO8601. Actualmente mi fragmento preferido es:
Si no le importa analizar cadenas sin TZ (sí), puede agregar una línea "s" para ampliar en gran medida la cantidad de alteraciones de formato cubiertas.
fuente
"yyyyMMdd"
en laformats
matriz para una precisión reducida a día, ya que este suele ser el caso cuando un RRULE RFC 5545 se basará en una DTSTART para proporcionar el tiempo.K
permite combinar sus diferentes manejos de zona horaria. Tengo una variante más extensa en stackoverflow.com/a/31246449/400547, pero es demasiado extensa (acepta cosas que son válidas ISO 8601 pero no se usan en los perfiles más comunes) pero muestra cómoK
puede reducir el tamaño en un tercero.fuente
Aquí hay uno que funciona mejor para mí ( versión LINQPad ):
produce
fuente
Parece importante hacer coincidir exactamente el formato de la cadena ISO para
TryParseExact
que funcione. Supongo que Exacto es Exacto y esta respuesta es obvia para la mayoría, pero de todos modos ...En mi caso, la respuesta de Reb.Cabin no funciona ya que tengo una entrada ligeramente diferente según mi "valor" a continuación.
Valor:
2012-08-10T14:00:00.000Z
Hay algunos miles adicionales allí por milisegundos y puede haber más.
Sin embargo, si agrego algo
.fff
al formato como se muestra a continuación, todo está bien.Cadena de formato:
@"yyyy-MM-dd\THH:mm:ss.fff\Z"
En la ventana inmediata VS2010:
cierto
Es posible que tenga que usar
DateTimeStyles.AssumeLocal
también dependiendo de la zona para la que sea su tiempo ...fuente
AssumeUniversal
aAdjustToUniversal
.Esto funciona bien en LINQPad4:
fuente
DateTime.ParseExact(...)
le permite decirle al analizador qué representa cada personaje.fuente