2010-10-27 11 views
5

Ho riscontrato un problema durante la conversione delle date tra il mio server e il client in cui entrambi sono in esecuzione in Germania. Le impostazioni regionali sui computer client potrebbero essere impostate sia nel Regno Unito che in Germania. Ricevo una data dal server che è in formato CET, e ho bisogno di rappresentare questa volta sull'interfaccia utente come ora del Regno Unito. Ad esempio, un tempo ricevuto dal server come dire, 01/07/2010 01:00:00 dovrebbe essere rappresentato sull'interfaccia utente come 01/07/2010 00:00:00. Ho scritto un convertitore per questo scopo, tuttavia durante l'esecuzione 'sto ottenendo una differenza di tempo di 2 ore. In basso è il codice, per favore puoi aiutare?Come rappresentare l'ora corrente del Regno Unito?

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

Stai ricevendo ora tedesca o GMT dal server? – Oded

+2

Domanda correlata: http: // stackoverflow.it/questions/2532729/daylight-saving-time-and-timezone-best-practice – Oded

+2

L'approccio migliore ha entrambe le volte in UTC e viene convertito in locale in base alle necessità –

risposta

12

penso che si sta convertendo a Ora UTC (invece del Regno Unito). Dato che l'Europa centrale è ancora estata (se le temperature dicono diversamente), la differenza è di +2 ore fino al 31 ottobre.

Se sai che stai convertendo dalla Germania al Regno Unito (vale a dire CEST in BST in estate e CET in GMT in inverno), perché non devi sottrarre solo 1 ora?

Se si desidera che le informazioni fuso orario per il Regno Unito, è possibile costruire utilizzando

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

Poi si potrebbe convertire la data utilizzando

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

Sì, vero UTC e fuso orario britannico (spesso chiamato UTC Dublino, Edimburgo, Lisbona, Londra nell'interfaccia utente) non sono la stessa cosa. Devi avere le informazioni sul fuso orario britannico e questo dovrebbe coprire l'ora legale per te. –

1

Usa TimeZoneInfo.ConvertTime per convertire fuso orario di ingresso originale (CET) per indirizzare fuso orario (UK).

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

una guida completa su MSDN here:

Conversione volte tra fusi orari

campione Codice modificato da 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

L'approccio migliore per affrontare le ore locali è il negozio li nella rappresentazione unificata come UTC.

Quindi è possibile convertire tutti i tempi di immissione in UTC (tramite .ToUniversalTime()) e memorizzare (o trasmettere) il suo valore. Quando devi mostrarlo, converti indietro usando .ToLocalTime().

Così si evitano i requisiti per sapere quale fuso orario era il valore originale e può facilmente mostrare il valore memorizzato in diversi fusi orari.

Inoltre, è possibile evitare problemi in ingresso in cui è necessario scrivere una logica specifica per il tempo di elaborazione nel prossimo fuso orario cercando di capire come convertirli tra tutti i disponibili.

+0

Penso che il problema qui sia che non lo vuole in ora locale, è in Germania (CET) e vuole mostrare l'ora nel Regno Unito (GMT). –

+0

@Steve Haigh, grazie al punto, ma può convertire il valore da UTC in qualsiasi fuso orario che desidera senza problemi. Ma OP dice di ricevere e mostrare le date dal server, quindi penso che la sua app funzioni solo su diversi fusi orari. –

-2

Mi rendo conto che la questione è per C#, ma se tutto quello che vogliamo fare è una singola conversione è possibile farlo dalla riga di comando PowerShell:

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

Questo script sarebbe convertire 17:00 ora del Regno Unito in il tuo fuso orario locale. Per me, sarebbe CST. È interessante notare che se avessi impostato la data al 27/03/2014, il risultato sarebbe diverso perché l'ora legale del Regno Unito inizia a date diverse negli Stati Uniti.

Problemi correlati