2010-07-29 24 views
5

tengo una fecha y hora (en utc) guardada en la base de datos y también conozco el desplazamiento utc en el siguiente formato.convertir hora utc y desplazamiento a DateTime

-03:00:00 

cómo convertir a un DateTime

+1

'12: 12: 12' no parece un desplazamiento UTC para mí, ni tampoco un campo' datetime'. ¿Puedes explicar el significado de cada parte? – Oded

+2

http://stackoverflow.com/questions/2548235/convert-utc-datetime-to-another-time-zone esto le ayudará –

+0

@Oded es el desplazamiento utc. su rango es -12: 00: 00 a 13:00:00 – developer

Respuesta

10

Esta forma más sencilla de aplicar una "compensación" a un DateTime que ya tiene es crear una estructura TimeSpan que mantiene su valor de desplazamiento, y luego simplemente " agregue "el desplazamiento al valor original DateTime".

Por ejemplo:

DateTime utcDateTime = DateTime.Parse("29 July 2010 14:13:45"); 
TimeSpan offSet = TimeSpan.Parse("-03:00:00"); 
DateTime newDateTime = utcDateTime + offSet; 
Console.WriteLine(newDateTime); 

Esto resulta en la salida siguiente:

29/07/2010 11:13:45

que es el tiempo original (29 de julio 2,010 14:13:45) menos 3 horas (la desplazamiento - -03: 00: 00).

Tenga en cuenta que esta técnica se limita a realizar aritmética simple con su valor DateTime y no tiene en cuenta las zonas horarias.

+2

Tenga en cuenta que Parse falla cuando tiene el signo '+' en la cadena. ¡Entonces use el signo '-' o ningún signo en absoluto! http://msdn.microsoft.com/en-us/library/se73z7b9%28v=vs.110%29.aspx – Jowen

+0

¿Qué hay del horario de verano? –

+0

@AnilPurswani Solo podrá aplicar la compensación de ahorro de luz diurna si conoce la zona horaria específica en lugar de solo un "descuento de horas". La clase TimeZoneInfo tiene una propiedad (SupportsDaylightSavingTime) para indicar si una zona horaria específica admite el horario de verano. Diferentes zonas horarias pueden tener las mismas horas de compensación, pero pueden o no soportar el horario de verano. – CraigTP

0

El problema es probable que se está ejecutando en es que la mayoría de los conductores de DB se deben recuperar de la base de datos crearán la DateTime con DateTimeKind.Unspecified, que no puede convertir a UTC correctamente incluso cuando se utiliza ToUniversalTime. Para resolver esto, utilizo un método de extensión como este:

public static DateTime ToSafeUniversalTime(this DateTime date) { 
     if(date != DateTime.MinValue && date != DateTime.MaxValue) { 
      switch(date.Kind) { 
      case DateTimeKind.Unspecified: 
       date = new DateTime(date.Year, date.Month, date.Day, date.Hour, date.Minute, date.Second, DateTimeKind.Utc); 
       break; 
      case DateTimeKind.Local: 
       date = date.ToUniversalTime(); 
       break; 
      } 
     } 
     return date; 
    } 
Cuestiones relacionadas