2009-11-18 14 views

Respuesta

55

No se puede analizar esa cadena porque "UTC" no es un designador de zona horaria válida.

hora UTC se denota mediante la adición de una 'Z' hasta el final de la cadena de tiempo, por lo que su código de análisis debe tener este aspecto:

DateTime.Parse("Tue, 1 Jan 2008 00:00:00Z"); 

Desde el Wikipedia article on ISO 8601

Si el tiempo está en UTC, agregue una 'Z' directamente después del tiempo sin un espacio . 'Z' es el designador de zona para el desplazamiento UTC cero. "09:30 UTC" es por lo tanto, representada como "09: 30Z" o "0930Z". "14:45:15 UTC" sería "14: 45: 15Z" o "144515Z".

La hora UTC también se conoce como hora 'Zulu', ya que 'Zulu' es la palabra fonética de la OTAN para 'Z'.

+1

La cadena de fecha en mi ejemplo provino del explorador de Internet – Dve

+0

@Dave: cuando dice que vino de IE, ¿quiere decir que la extrajo de una página web? Puede que tenga que escribir su propio reemplazo para el analizador de DateTime que extrae el UTC y lo reemplaza por un Z. –

+0

Después de haber estado probando contra FF, había olvidado que llamé al método toUTCString() en la fecha en que POST volví al servidor. FF envía GMT mientras que IE envía UTC. Así que no puedo culpar a IE ... esta vez! – Dve

-3
No

seguro por qué, pero se puede envolver DateTime.ToUniversalTime en un try/catch y lograr el mismo resultado en más código.

Buena suerte.

+0

ToUniversalTime nunca arroja una excepción – porges

13

es necesario especificar el formato:

DateTime date = DateTime.ParseExact(
    "Tue, 1 Jan 2008 00:00:00 UTC", 
    "ddd, d MMM yyyy HH:mm:ss UTC", 
    CultureInfo.InvariantCulture); 
+2

Buena sugerencia, pero esto fallaría si la cadena de fecha proporcionada no contiene UTC al final. Digamos que en su lugar pasó una cadena de fecha que tenía +01 al final, causaría una FormatException. Depende de lo que intenta hacer, supongo. –

10

o utilizar el AdjustToUniversal DateTimeStyle en una llamada a

DateTime.ParseExact(String, String[], IFormatProvider, DateTimeStyles) 
+0

Lo he intentado, y parece que no funciona – Dve

+4

Esto realmente funciona. He utilizado este código y tengo correcta UTC UTC DateTime de cadena: DateTime.TryParseExact ("2012-01-30T00: 28: 00Z", "aaaa-MM-DDThh: mm: ssZ", CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal, out timeValue)); – Roboblob

+15

Este también funciona, Utc in y out, sin formato, no se requiere Z: DateTime.Parse ("8/3/2013 1:02:41 AM", CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal); – crokusek

6

No es un formato válido, sin embargo "mar 1er Ene 2008 00 : 00: 00 GMT "es.

La documentación dice así:

Una cadena que incluye información de zona horaria y se ajusta a la norma ISO 8601. Por ejemplo, la primera de las dos cadenas siguientes designa el Tiempo Universal Coordinado (UTC); la segunda designa el tiempo en una zona horaria siete horas antes de UTC:

2008-11-01T19: 35: 00.0000000Z

Una cadena que incluye el designador GMT y se ajusta al formato de hora RFC 1123. Por ejemplo:

Sab 01 Nov 2008 19:35:00 GMT

Una cadena que incluye la fecha y la hora junto con la compensación de zona horaria información. Por ejemplo:

03/01/2009 05:42:00 -5: 00

+0

Un simple reemplazo de "UTC" con "GMT" en una cadena de fecha similar a este formato funciona muy bien, gracias por la sugerencia. –

+1

Aunque tenga en cuenta que esto devuelve un 'DateTime' con un' Tipo' de 'Local' para mí. Parece que la solución es utilizar [DateTimeOffset.Parse] (http://stackoverflow.com/a/14774345/1028230) (y luego 'x.UtcDateTime') si desea asegurarse de que no se está cayendo del UTC carro durante tu análisis. – ruffin

5

Para analizar correctamente la cadena dada en la pregunta sin cambiarlo, utilice la siguiente:

using System.Globalization; 

string dateString = "Tue, 1 Jan 2008 00:00:00 UTC"; 
DateTime parsedDate = DateTime.ParseExact(dateString, "ddd, d MMM yyyy hh:mm:ss UTC", CultureInfo.CurrentCulture, DateTimeStyles.AssumeUniversal); 

Este La implementación usa una cadena para especificar el formato exacto de la cadena de fecha que se está analizando.El parámetro DateTimeStyles se usa para especificar que la cadena dada es una cadena de tiempo universal coordinada.

8

Suponiendo que utiliza el formato "o" para su fecha y hora para que tenga "2016-07-24T18: 47: 36Z", hay una forma muy sencilla de manejar esto.

Llame DateTime.Parse("2016-07-24T18:47:36Z").ToUniversalTime().

¿Qué sucede cuando llamas al DateTime.Parse("2016-07-24T18:47:36Z") y obtienes un DateTime configurado en la zona horaria local. Entonces lo convierte a la hora local.

El ToUniversalTime() lo cambia a un UTC DateTime y lo convierte a la hora UTC.

+0

He estado golpeándome la cabeza durante horas en este ... ¡gracias! – Corelgott

1

que sólo tiene que utilizar:

var myDateUtc = DateTime.SpecifyKind(DateTime.Parse("Tue, 1 Jan 2008 00:00:00"), DateTimeKind.Utc); 

if (myDateUtc.Kind == DateTimeKind.Utc) 
{ 
    Console.WriteLine("Yes. I am UTC!"); 
} 

Usted puede probar el código utilizando el compilador de C# en línea:

http://rextester.com/

espero que ayude.

0

Basta con sustituir "UTC" con "GMT" - simple y no se rompe fechas con el formato correcto:

DateTime.Parse("Tue, 1 Jan 2008 00:00:00 UTC".Replace("UTC", "GMT")) 
Cuestiones relacionadas