2010-09-13 25 views
5

Estoy escribiendo una aplicación web bastante grande en asp.net/c# con MSSQL 2008 r2 en la base de datos. El programa necesita convertir cadenas date/time (en formato de fecha ISO) a DateTime donde se usan y más tarde se almacenan como smalldatetime en sql.Convertir a y desde datetime agrega una hora?

Cuando las cadenas se convierten a datetimes, se agrega misteriosamente un hour al resultado. Entiendo que estando en el Reino Unido, estamos sujetos al horario de verano (actualmente activo) pero seguramente el método datetime .convert entiende esto? Al convertir de nuevo a una cadena, el resultado es el esperado.

He escrito un pequeño programa para ilustrar el problema (también incluyendo fechas ISO no para mi salud mental):

class Program 
{ 


    static void Main(string[] args) 
    { 
     //BB(); 
     //Dist(); 
     DateTime d1 = new DateTime(); 
     DateTime d2 = new DateTime(); 
     string d1s = "2010-09-13T09:30:01Z"; 
     string d2s = "2010-09-13 09:30:01"; 

     d1 = Convert.ToDateTime(d1s); 
     d2 = Convert.ToDateTime(d2s); 

     Console.WriteLine("d1s:{0} d1:{1} ", d1s, d1); 
     Console.WriteLine("d2s:{0} d2:{1} ", d2s, d2); 

     d1s = d1.ToString("u"); d2s = d2.ToString("u"); 

     Console.WriteLine("\nd1: {0}", d1s); 
     Console.WriteLine("d2: {0}", d2s); 

     d1 = Convert.ToDateTime(d1s); 
     d2 = Convert.ToDateTime(d2s); 

     Console.WriteLine("\nd1s:{0} d1:{1} ", d1s, d1); 
     Console.WriteLine("d2s:{0} d2:{1} ", d2s, d2); 

     Console.Read(); 
    } 
} 

Estos son los resultados que obtengo cuando corro el programa:

d1s:2010-09-13T09:30:01Z d1:13/09/2010 10:30:01 
d2s:2010-09-13 09:30:01 d2:13/09/2010 09:30:01 

d1: 2010-09-13 10:30:01Z 
d2: 2010-09-13 09:30:01Z 

d1s:2010-09-13 10:30:01Z d1:13/09/2010 11:30:01 
d2s:2010-09-13 09:30:01Z d2:13/09/2010 10:30:01 
Done 

¿Es este el comportamiento correcto? ¿Estoy siendo un idiota? Esperaría convertir datetime a string y luego la cadena exacta volvería a datetime devolvería la entrada original. Si este es el comportamiento correcto, ¿alguna idea sobre cómo obtener un resultado consistente pero aún usando Convert.ToDateTime()?

Muchas gracias.

Respuesta

11

La 'Z' al final de la fecha y hora significa "Zulu" (equivalente a UTC/GMT). De forma predeterminada, al convertir una cadena con eso al final se convertirá a la hora local (+ 1 hora en su caso).

Sin la 'Z' .NET asumirá que la fecha ya está en el formato correcto y no agrega la hora.

Cuando vuelve a formatear la fecha y hora en una cadena, está utilizando la cadena de formato de "U". Esto indica a .NET que es una hora UTC y debe formatearse de esa manera. Por lo tanto, agrega la 'Z' al final. Cuando lo convierte de nuevo en una fecha, se agrega otra hora para hacerlo local.

Para aclarar:

d1: comienza como una cadena UTC -> hora local (+ 1 hora) -> string UTC -> hora local (+1 hora)

d2: comienza como un local de string -> hora local (sin cambios) -> cadena UTC -> hora local (+ 1 hora)

+0

Ahh, por lo que soltar la "Z" arreglará las cosas. Tendré que hacer una cadena de respuestas porque ese es el formato en el que lo obtengo. (Editar, sí, eso pareció arreglarlo. Gracias) –

Cuestiones relacionadas