2010-07-23 40 views
30

Tengo un DateTime almacenado en la hora universal (UTC) del valor 2010-01-01 01:01:01.datetime para encadenar con la zona horaria

me gustaría mostrarlo en EST en este formato 2010-01-01 04: 01: 01GMT-04: 00, sin embargo formateador la 'K' para la zona horaria no funciona en ToString

+0

¿Tiene el tiempo en hora universal (UTC) o hora del meridiano de Greenwich (GMT)? – Guffa

+0

UTC perdón por el error tipográfico – Comma

Respuesta

48

Utilice el especificador de formato "zzz" para obtener el desplazamiento UTC. Por ejemplo:

 var dt = new DateTime(2010, 1, 1, 1, 1, 1, DateTimeKind.Utc); 
     string s = dt.ToLocalTime().ToString("yyyy-MM-dd HH:mm:ss \"GMT\"zzz"); 
     Console.WriteLine(s); 

de salida: 2009-12-31 19:01:01 GMT-06: 00

estoy en la zona horaria CDT. Asegúrese de que DateTime sea inequívocamente DateTimeKind.Utc.

+3

GMT no es ambiguo para el horario de verano. No cambia para el horario de verano. –

3

Algo así funciona. Probablemente pueda limpiarlo un poco más:

string newDate = string.Format("{0:yyyy-MM-dd HH:mm:ss} GMT {1}", dt.ToLocalTime(), dt.ToLocalTime().ToString("%K")); 
+1

Usted, probablemente, significó 'HH', no' hh'. – Sasha

+0

Probablemente ... el "hh" da el resultado del reloj de 12 horas donde "HH" da el resultado de tiempo militar. – Robaticus

+0

Robaticus, quise decir que el formato de 12 horas es incompatible con el resto de su respuesta, porque no especifica AM/PM. Es decir. o bien 't' /' tt' se debe agregar para hacer que 'hh' sea significativo (por ejemplo '02:00 AM',' 03:00 PM'), o 'hh' debe reemplazarse por' HH' para producir 24 horas formato (por ejemplo, '02: 00',' 15: 00'). Entonces, el formato 'aaaa-MM-dd hh: mm: ss' produce resultados ambiguos que no pueden decodificarse atrás :(. – Sasha

1

Este método devolverá el tiempo especificado en Eastern Standard Time (como la cuestión solicitó), incluso si EST no es la zona horaria local:

public string GetTimeInEasternStandardTime(DateTime time) 
{ 
    TimeZoneInfo easternStandardTime = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"); 
    DateTimeOffset timeInEST = TimeZoneInfo.ConvertTime(time, easternStandardTime); 
    return timeInEST.ToString("yyyy-MM-dd hh:mm:ss tt\" GMT\"zzz"); 
} 

Nota: No he probado esto en un sistema operativo no inglés. Consulte la documentación de MSDN en TimeZoneInfo.FindSystemTimeZoneById.

+1

@Sasha Ese es un buen punto, esta respuesta antes no eliminaba la ambigüedad entre AM y PM. agregó el "tt" a la cadena de formato de tiempo para agregar AM/PM. Según su comentario, alternativamente puede reemplazar "hh" por "HH" para dar salida a las horas con un reloj de 24 horas (de 00 a 23). –

Cuestiones relacionadas