2011-11-02 11 views
32

Sto cercando di ottenere il GMT in tempo UNIX. Io uso il seguente codice:Conversioni di tempo Unix in C#

 

     public static long GetGMTInMS() 
     { 
      var unixTime = DateTime.Now.ToUniversalTime() - 
       new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); 

      return (long)unixTime.TotalMilliseconds; 
     } 
 

Per poi convertire il tempo unix indietro a un oggetto DatTime, io uso questo:

 

     public static DateTime UnixTimeStampToDateTime(double unixTimeStamp) 
     { 
      System.DateTime dtDateTime = new DateTime(1970, 1, 1, 0, 0, 0, 0); 
      dtDateTime = dtDateTime.AddMilliseconds(unixTimeStamp).ToLocalTime(); 
      return dtDateTime; 
     } 
 

quando l'eseguo, il GetGMTInMS()1320249196267. Quando lo passo a UnixTimeStampToDateTime() ottengo {11/2/2011 11:53:16 AM}

Che va bene. Questa è l'ora corretta quando ho eseguito il mio codice. Il problema che ho è quando provo a inserire 1320249196267 in un convertitore di tempo unix, come ad esempio this, restituisce il tempo completamente sbagliato.

L'altro problema è che sono nel fuso orario orientale. Questo ha restituito il tempo nel mio fuso orario. È qualcosa che l'oggetto DateTime gestisce o non ricevo il GMT.

risposta

107

"Timestamp Unix" significa secondi dall'epoca nella maggior parte delle situazioni anziché in millisecondi ... attenzione! Tuttavia, cose come Java usano "millisecondi dall'epoca" che potrebbero essere ciò che ti interessa esattamente - nonostante lo strumento che hai mostrato. Dipende davvero da ciò di cui hai bisogno.

Inoltre, non si dovrebbe fare nulla con l'ora locale. Attenersi al tempo universale in tutto.

avrei:

private static readonly DateTime UnixEpoch = 
    new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); 

public static long GetCurrentUnixTimestampMillis() 
{ 
    return (long) (DateTime.UtcNow - UnixEpoch).TotalMilliseconds; 
} 

public static DateTime DateTimeFromUnixTimestampMillis(long millis) 
{ 
    return UnixEpoch.AddMilliseconds(millis); 
} 

public static long GetCurrentUnixTimestampSeconds() 
{ 
    return (long) (DateTime.UtcNow - UnixEpoch).TotalSeconds; 
} 

public static DateTime DateTimeFromUnixTimestampSeconds(long seconds) 
{ 
    return UnixEpoch.AddSeconds(seconds); 
} 
+1

Il tipo restituito deve essere "ulong" anziché lungo, poiché i timestamp UNIX non possono essere negativi? –

+6

@ErikSchierboom: Beh, dipende da: ci sono molti scenari in cui "secondi dall'epoca di Unix" o "millisecondi dall'epoca di Unix" vengono usati dove * possono * essere negativi. Dato che i secondi "long.MaxValue" sono sempre così lontani, penso che sia più sensato essere flessibili e accettare valori negativi per tempi precedenti al 1970. –

+0

Ok, ho capito! Grazie per la spiegazione. –

5

UNIX time is seconds from 1/1/1970, non millisecondi. Cambiare il codice per utilizzare secondi anziché millisecondi e dovrebbe funzionare,

+0

vedo alcun motivo per l'uso del tempo locale * ovunque * nel codice del PO. .. Io non * penso * rompe qualcosa in questo caso, ma rende il codice più difficile da verificare. –

Problemi correlati