2010-10-27 14 views
5

Tengo un problema al convertir las fechas entre mi servidor y el cliente donde ambos se ejecutan en Alemania. La configuración regional en las máquinas del cliente podría establecerse tanto en el Reino Unido como en Alemania. Recibo una fecha del servidor que es formato CET, y necesito representar esta vez en la interfaz de usuario como hora del Reino Unido. Por ejemplo, un tiempo recibido del servidor como digamos, 01/07/2010 01:00:00 debe estar representado en la interfaz de usuario como 01/07/2010 00:00:00. He escrito un convertidor para este propósito, sin embargo, mientras lo ejecuto recibo una diferencia horaria de 2 horas. A continuación está el código, ¿pueden ayudarme?¿Cómo representar la hora actual del Reino Unido?

public class LocalToGmtConverter : IDateConverter 
{ 
    private readonly TimeZoneInfo timeZoneInfo; 

    public LocalToGmtConverter() 
     : this(TimeZoneInfo.Local) 
    { 

    } 
    public LocalToGmtConverter(TimeZoneInfo timeZoneInfo) 
    { 
     this.timeZoneInfo = timeZoneInfo; 
    } 

    public DateTime Convert(DateTime localDate) 
    { 
     var utcKind = DateTime.SpecifyKind(localDate, DateTimeKind.Utc); 
     return utcKind; 
    } 

    public DateTime ConvertBack(object fromServer) 
    { 
     DateTime serverDate = (DateTime)fromServer; 

     var utcOffset = timeZoneInfo.GetUtcOffset(serverDate); 

     var uiTime = serverDate- utcOffset; 

     return uiTime; 

    } 
} 
+1

¿Está recibiendo hora alemana o GMT del servidor? – Oded

+2

Pregunta relacionada: http: // stackoverflow.com/preguntas/2532729/horario de verano-tiempo-y-zona horaria-best-prácticas – Oded

+2

El mejor enfoque tienen dos veces en la hora UTC y se convierten en locales, según sea necesario –

Respuesta

12

creo que va a convertir a Hora UTC (en lugar de RU). Dado que aún hay horario de verano en Europa Central (evento si las temperaturas dicen lo contrario), la diferencia es de +2 horas hasta el 31 de octubre.

Si sabe que está convirtiendo de Alemania a Reino Unido (es decir, CEST a BST en verano y CET a GMT en invierno), ¿por qué no solo resta 1 hora?

Si desea que la información de zona horaria para el Reino Unido, puede construir usando

var britishZone = TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time"); 

Posteriormente, se podría convertir la fecha usando

var newDate = TimeZoneInfo.ConvertTime(serverDate, TimeZoneInfo.Local, britishZone); 
+1

Sí, cierto UTC y la zona horaria británica (a menudo llamado algo así como UTC Dublín, Edimburgo, Lisboa, Londres en la interfaz de usuario) no son lo mismo. Usted necesita obtener la información de la zona horaria británica y eso debe cubrir el horario de verano para usted. –

1

Uso TimeZoneInfo.ConvertTime para convertir la entrada original de zona horaria (CET) para dirigirse a la zona horaria (Reino Unido).

public static DateTime ConvertTime(
    DateTime dateTime, 
    TimeZoneInfo sourceTimeZone, 
    TimeZoneInfo destinationTimeZone 
) 

guía completa en MSDN here:

conversión de tiempos entre zonas horarias

Modificado ejemplo de código de MSDN:

DateTime ceTime = new DateTime(2007, 02, 01, 08, 00, 00); 
try 
{ 
    TimeZoneInfo ceZone = TimeZoneInfo.FindSystemTimeZoneById("Central Europe Standard  Time"); 
    TimeZoneInfo gmtZone = TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time"); 
    Console.WriteLine("{0} {1} is {2} GMT time.", 
      ceTime, 
      ceZone.IsDaylightSavingTime(ceTime) ? ceZone.DaylightName : ceZone.StandardName, 
      TimeZoneInfo.ConvertTime(ceTime, ceZone, gmtZone)); 
} 
catch (TimeZoneNotFoundException) 
{ 
    Console.WriteLine("The registry does not define the required timezones."); 
}       
catch (InvalidTimeZoneException) 
{ 
    Console.WriteLine("Registry data on the required timezones has been corrupted."); 
} 
0

El mejor enfoque para hacer frente a los tiempos locales es la tienda ellos en representación unificada como UTC.

Para que pueda convertir todos los tiempos de entrada a UTC (a través de .ToUniversalTime()), y almacenar (o transmitir) su valor. Cuando necesite mostrarlo simplemente convierta de nuevo usando .ToLocalTime().

Así que evita requisitos para saber qué zona horaria era el valor original y puede mostrar fácilmente el valor almacenado en diferentes zonas horarias.

También puede evitar problemas entrantes donde tiene que escribir una lógica específica para procesar el tiempo en la próxima zona horaria tratando de encontrar la manera de convertirlos entre todos disponibles.

+0

Creo que el problema aquí es que no lo quiere en horario local, está en Alemania (CET) y quiere mostrar la hora en el Reino Unido (GMT). –

+0

@Steve Haigh, gracias al punto, pero puede convertir el valor de UTC a cualquier hora que desee sin ningún problema. Pero OP dice acerca de recibir y mostrar las fechas del servidor, así que creo que su aplicación solo funciona en diferentes zonas horarias. –

-2

realizo la pregunta es para C#, pero si lo que quieres hacer es una sola conversión que puede hacer esto desde la línea de comandos de PowerShell:

$d = [DateTime]::Parse("04/02/2014 17:00:00") 
$gmt = [TimeZoneInfo]::FindSystemTimeZoneById("GMT Standard Time"); 
[TimeZoneInfo]::ConvertTime($d, $gmt, [TimeZoneInfo]::Local) 

Este script se convertiría en 17:00 hora del Reino Unido su zona horaria local. Para mí, eso sería CST. Es interesante observar que si hubiera configurado la fecha hasta el 27/03/2014, el resultado sería diferente porque el horario de verano del Reino Unido entra en vigencia en diferentes fechas en Estados Unidos.

Cuestiones relacionadas