2014-09-08 8 views
5

come è possibile determinare le ore trascorse tra due volte. Per esempio:Ore trascorse tra due tempi, indipendentemente dal fuso orario e paese

3:30 pm nella San Francisco e 19:30 a Dubai

La parte che io sono poco chiaro è che, c'è un modo universale di calcolo del periodo sottratto, prendendo fusi orari e paesi in per conto.

Sto usando C# come lingua principale. Qualsiasi aiuto sarà profondamente apprezzato.

Grazie in anticipo.

+1

Stai cercando il formato UTC? – danish

+0

Controlla [qui] (http://stackoverflow.com/questions/6930489/safely-comparing-local-and-universal-datetimes). – PTwr

risposta

4

hai chiesto:

"15:30 a San Francisco e 19:30 a Dubai"

Se tutto quello che sai è il tempo e posizione, quindi hai un problema perché non tutti i fusi orari sono entità fisse. Dubai è fissato a UTC + 4, ma San Francisco si alterna tra UTC-8 per Pacific Standard Time e UTC-7 per Pacific Daylight Time. Pertanto, per effettuare questa conversione è richiesta anche la data.

Di seguito vi darà la differenza con l'attuale data di nel primo fuso orario:

TimeZoneInfo tz1 = TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time"); 
TimeZoneInfo tz2 = TimeZoneInfo.FindSystemTimeZoneById("Arabian Standard Time"); 

DateTime today = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, tz1).Date; 

DateTime dt1 = new DateTime(today.Year, today.Month, today.Day, 15, 30, 0); // 3:30 PM 
DateTime dt2 = new DateTime(today.Year, today.Month, today.Day, 19, 30, 0); // 7:30 PM 

TimeSpan elapsed = TimeZoneInfo.ConvertTimeToUtc(dt1, tz1) - 
        TimeZoneInfo.ConvertTimeToUtc(dt2, tz2); 

(Si noti che l'ID "Pacific Standard Time" è l'identificatore del fuso orario di Windows per la zona in Stati Uniti Ora del Pacifico, e nonostante il nome, copre sia PST e PDT.)

Ma anche questo non è necessariamente l'approccio migliore perché "oggi" non è la stessa in tutti i fusi orari. A (quasi) in qualsiasi momento, ci sono due giorni diversi in funzione in tutto il mondo. Questa illustrazione from Wikipedia lo dimostra bene.

                                                        Date Animation

È possibile che la data "corrente" per il fuso orario dell'origine sia non la stessa data attualmente nel fuso orario finale. Senza ulteriori input, non c'è molto che puoi fare al riguardo. È necessario conoscere la data in questione per ciascun valore.

0

Il modo più semplice è quello di convertire entrambi gli oggetti DateTime UTC e poi sottraendo:

var utcSanFran = sfLocal.ToUniversalTime(); 
var utcDubai = dubaiLocal.ToUniversalTime(); 
var elapsed = dubaiLocal - sfLocal; 

Supponendo che Dubai> San Francisco.

Per ottenere le ore totali utilizzo trascorso:

elapsed.TotalHours; 

Si prega di notare che questo sarà a quanto pare funziona solo per il fuso orario del computer locale. Vedere http://msdn.microsoft.com/en-us/library/system.timezoneinfo(v=vs.110).aspx per un modo migliore per farlo.

+0

Ummm ... no. Questa non è una buona soluzione. Quando chiami 'ToUniversalTime', può solo convertire dal fuso orario locale della macchina su cui è in esecuzione. Dal momento che un singolo computer non può essere a San Francisco e Dubai allo stesso tempo, questo codice non funzionerà indipendentemente da dove viene eseguito. –

+0

Il minimo che si possa fare è puntare alla soluzione corretta. http://msdn.microsoft.com/en-us/library/system.timezoneinfo(v=vs.110).aspx dovrebbe fornire tutte le informazioni richieste dall'OP. – t0yk4t

+0

Posso digitare solo così velocemente. :) –

2

Se si utilizza il tipo DateTimeOffset si può evitare alcune delle insidie ​​di utilizzare l'ora locale, perché può rappresentare l'ora locale in qualsiasi fuso orario:

var dateTimeOffsetSanFrancisco = DateTimeOffset.Parse("9/8/2014 3:30PM -0700"); 
var dateTimeOffsetDubai = DateTimeOffset.Parse("9/8/2014 7:30PM +0400"); 
var elapsedHours = (dateTimeOffsetDubai - dateTimeOffsetSanFrancisco).TotalHours; 
+1

Si prega di notare che l'utilizzo di .Hours non restituirà sempre l'importo corretto: verrà "Rollover" a volte superiore a un giorno (ovvero 25 ore restituiranno 1). TotalHours ti darà le effettive 'ore totali trascorse'. – t0yk4t

+0

@MelanieSchmidt: Oops, è stato uno stupido errore di battitura. Risolto ora. Grazie. –

+0

Sì, questo è anche un buon approccio: quando si conoscono le date e gli offset in anticipo. –