[Actualización: Los especificadores de formato no son lo mismo que las cadenas de formato; un especificador de formato es una parte de una cadena de formato personalizado, donde una cadena de formato es 'stock' y no proporciona personalización. Mi problema es con especificadores no formatos]¿Dónde está el especificador de formato DateTime 'Z'?
que he estado tratando de realizar conversiones DateTime de ida y vuelta con una cadena de formato que utiliza especificador de formato 'zzz', que sé que está ligado a la hora local. Por lo tanto, si intento un viaje de ida y vuelta con una fecha UTC, arroja una excepción DateTimeInvalidLocalFormat, que debería, con este texto:
Un UTC DateTime se está convirtiendo a texto en un formato que solo es correcto para las horas locales . Esto puede suceder cuando se llama a DateTime.ToString utilizando el especificador de formato 'z', que incluirá un desplazamiento de zona horaria local en la salida. En ese caso, use el especificador de formato 'Z', que designa una hora UTC, o use la cadena de formato 'o', que es la forma recomendada de conservar un DateTime en el texto. Esto también puede ocurrir al pasar un DateTime para ser serializado por XmlConvert o DataSet. Si usa XmlConvert.ToString, pase XmlDateTimeSerializationMode.RoundtripKind para serializar correctamente. Si usa DataSet, configure DateTimeMode en el objeto DataColumn en DataSetDateTime.Utc.
Basado en esta sugerencia, todo lo que tengo que hacer para que mi código funcione es reemplazar 'zzz' con 'ZZZ' para que pueda estar en un formato UTC. El problema es que 'Z' no se encuentra en ninguna parte de la documentación y cualquier combinación de formato 'Z' que intente, es decir, 'Z', 'ZZ', 'ZZZ', siempre convierte la instancia de DateTime con esas Z tratadas como literales .
¿Alguien se olvidó de implementar 'Z' sin decirle al autor del mensaje de excepción, o me falta cómo cambiar un desplazamiento de hora local válido con "+0000" sin piratear?
Código Ejemplo:
// This is the format with 'zzzzz' representing local time offset
const string format = "ddd MMM dd HH:mm:ss zzzzz yyyy";
// create a UTC time
const string expected = "Fri Dec 19 17:24:18 +0000 2008";
var time = new DateTime(2008, 12, 19, 17, 24, 18, 0, DateTimeKind.Utc);
// If you're using a debugger this will rightfully throw an exception
// with .NET 3.5 SP1 because 'z' is for local time only; however, the exception
// asks me to use the 'Z' specifier for UTC times, but it doesn't exist, so it
// just spits out 'Z' as a literal.
var actual = time.ToString(format, CultureInfo.InvariantCulture);
Assert.AreEqual(expected, actual);
Quizás podría suministrar con un ejemplo de código real de lo que está tratando de hacer, así que no tienen que perder tiempo tratando de adivinar? –
Acabo de actualizar con una muestra. Estoy confundido porque sé que 'Z' no es compatible de acuerdo con MSDN, pero la excepción me pide que lo use. Y lo que quiero hacer es convertir con esta cadena personalizada, incluso si es UTC, y obtener "+0000" en el resultado, como si obtuviera "-04: 00" si usaba 'zzz' con un hora local. –
Veo tu problema ahora; gracias por la actualización del código Me zambulliré en él por un rato y publicaré algo si lo encuentro. –