2011-03-05 5 views
10

Ho bisogno di convertire un DateTime in un timestamp Unix. Così ho googled è alla ricerca di un po 'di codice di esempioPerché TimeTime su Unix time usa un double invece di un intero?

in quasi tutti i risultati che vedo, usano double come il cambio di una tale funzione, anche se in modo esplicito utilizzando floor per convertirlo in un numero intero. I timestamp Unix sono sempre interi. Quindi, che problema c'è con l'utilizzo di long o int invece del doppio?

static double ConvertToUnixTimestamp(DateTime date) 
{ 
    DateTime origin = new DateTime(1970, 1, 1, 0, 0, 0, 0); 
    TimeSpan diff = date - origin; 
    return Math.Floor(diff.TotalSeconds); 
} 
+0

IMHO solo per non convalidare la data di inserimento. Dovrebbe restituire una struttura lunga o ad hoc – onof

+1

Non c'è motivo, è solo codice scadente. Trasmetti a lungo, non può traboccare. –

+0

Aggiungerò che per definizione il timepstamp Unix è UTC. Il metodo dovrebbe verificare se DateTime.Kind è UTC, Locale o Non specificato. Almeno se Local I verrebbe convertito in UTC prima di eseguire la conversione. Facoltativamente, se si desidera un timestamp Unix locale, è possibile aggiungere un sovraccarico o un parametro per non eseguire la conversione in UTC. – Nate

risposta

3

Di solito, lo implementerei con una lunghezza non firmata invece di richiedere all'utente di arrotondare in su o in giù e di eseguire il cast su int o long. Una ragione per cui qualcuno potrebbe volere un doppio è se si usasse una struttura simile a quella del tempo, ad esempio in gettimeofday. Permette una precisione inferiore al secondo ...

3

Per evitare il bug 2038 su sistemi a 32 bit?

+7

Si potrebbe pensare che avrebbero potuto usare un lungo però. – nos

1

I doppi coprono più terreno rispetto a qualsiasi altra variabile nel tipo int.

+0

sì, ma un "lungo" coprirebbe migliaia di anni. Sicuramente il mio software non funzionerà tra un paio di migliaia di anni. – Earlz

+0

Suppongo che se tu avessi del software che ha bisogno di calcolare qualche eone nel futuro o nel passato, potrebbe essere d'aiuto. Tuttavia, questo è un caso particolare e probabilmente si utilizzerà un tipo di dati personalizzato in detto scenario. – Nate

-1

Non si tratta di "anni". ma di ore su una macchina ragionevole (s), correttamente collegato.

Ma puoi immaginare di mettere insieme l'enorme spazio di archiviazione? Ho circa 30 TB di dati off e mi inondano - dedico più tempo alla catalogazione che al lavoro vero e proprio.

Buona fortuna per i tuoi sforzi