2010-11-05 16 views
12

Sto provando a scrivere una funzione che convertirà un'istanza DateTime.Now nel numero di secondi che rappresenta in modo da poterla confrontare con un'altra istanza di DateTime. Ecco quello che ho attualmente:Converti DateTime.Ora in secondi

public static int convertDateTimeToSeconds(DateTime dateTimeToConvert) 
    { 
     int secsInAMin = 60; 
     int secsInAnHour = 60 * secsInAMin; 
     int secsInADay = 24 * secsInAnHour; 
     double secsInAYear = (int)365.25 * secsInADay; 

     int totalSeconds = (int)(dateTimeToConvert.Year * secsInAYear) + 
         (dateTimeToConvert.DayOfYear * secsInADay) + 
         (dateTimeToConvert.Hour * secsInAnHour) + 
         (dateTimeToConvert.Minute * secsInAMin) + 
         dateTimeToConvert.Second; 

     return totalSeconds; 
    } 

mi rendo conto che sto troncando il calcolo per secondi in un anno, ma non ho bisogno di mio calcolo per essere precisi. Sto davvero cercando di sapere se il metodo che sto usando per calcolare i secondi è corretto.

Qualcuno ha qualcosa che potrebbe meglio calcolare i secondi dati da un oggetto DateTime?

Inoltre, il tipo di ritorno deve essere int64 se sto codificando in C# se sto andando a calcolare tutti i secondi da 0 AD?

+2

dispiace se devo essere ficcanaso, ma perché stai confrontando secondi invece che il costruito in strumenti di data di calcolo? – Marko

+0

Sto cercando di sottrarre una variabile che è un numero intero espresso in secondi da uno dei due oggetti sopra indicati. – AndHeCodedIt

risposta

24

Il tipo DateTime supporta comparison operators:

if (dateTimeA > dateTimeB) 
{ 
    ... 

Questo funziona anche per DateTime valori restituiti dalla DateTime.AddSeconds:

if (dateTimeA.AddSeconds(42) > dateTimeB) 
{ 
    ... 

Se si vuole veramente il numero di secondi che intercorre dal momento 01/01/0001 00:00:00, è possibile calcolare la differenza tra la t wo DateTime values. Il TimeSpan valore risultante ha una proprietà TotalSeconds:

double result = DateTime.Now.Subtract(DateTime.MinValue).TotalSeconds; 
+0

+1, ho usato questo. Grazie per la pronta risposta. – AndHeCodedIt

5

Se lo scopo è trovare il numero di secondi tra due date, si sarebbe molto meglio utilizzando l'oggetto TimeSpan.

+0

Attenzione: si desidera TimeSpan.TotalSeconds, non TimeSpan.Seconds – dtb

+0

Utilizzare TotalSeconds, non Seconds. Secondi rappresenta il resto dei secondi dopo aver calcolato i giorni, le ore, i minuti ecc ... – rein

+0

Grazie; fisso. Se era confuso e pensavo che le funzioni "totali" restituivano quante unità intere c'erano, invece di includere qualsiasi frazione di quelle unità. – GendoIkari

4

Se si desidera confrontare 2 oggetto DateTime, perché non utilizzare gli operatori forniti? http://msdn.microsoft.com/en-us/library/aa326723%28v=VS.71%29.aspx

DateTime a, b; 
if (a > b) //a is after b 
+0

funzionerà se (a.AddSeconds> b)? Motivo che chiedo è perché ho un tempo di buffer che avrei dovuto sottrarre da uno dei due oggetti. Il tempo di buffer è in secondi. – AndHeCodedIt

+2

Sì, si potrebbe fare questo: se DateTime.Now.AddSeconds (10)> otherDateTime – rein

+0

1 Questa è l'implementazione che ho intenzione di usare. – AndHeCodedIt

3

vorrei utilizzare la classe TimeSpan per ottenere la differenza esatta tra due istanze DateTime. Ecco un esempio:

DateTime dt1 = DateTime.Now; 
    DateTime dt2 = new DateTime(2003,4,15); 
    TimeSpan ts = dt1.Subtract(dt2); 

Una volta che il valore TimeSpan (ts, nel frammento di codice di cui sopra) è disponibile, è possibile esaminare i valori di convertire correttamente il TimeSpan ad un determinato numero di secondi.

+2

Una cattura per assicurarsi di utilizzare ts.TotalSeconds che converte TimeSpan in secondi invece di ts.Seconds, che è solo il componente secondi. –

6

E 'davvero non ha senso per convertire un oggetto DateTime secondi. I secondi hanno senso solo se si ha a che fare con un intervallo di tempo (TimeSpan). Se volete confrontare due date per conoscere il numero di secondi tra di loro:

TimeSpan diff = DateTime.Now - PreviousDateTime; 
double seconds = diff.TotalSeconds; 
3

Supponendo che si ha realmente bisogno per ottenere i secondi per l'oggetto datetime, si potrebbe ottenere direttamente il "zecche" proprietà da esso. Questi non sono in pochi secondi, ma puoi facilmente dividerli con il giusto fattore per convertire le zecche in secondi. See: http://msdn.microsoft.com/en-us/library/system.datetime.ticks.aspx

Quindi, qualcosa di simile:

 DateTime.Now.Ticks/TimeSpan.TicksPerSecond 
2

Utilizzando un periodo per ottenere il tempo trascorso tra due DateTimes è probabilmente il modo migliore per andare, ma se si davvero desidera ottenere il numero di secondi per un dato DateTime si potrebbe fare qualcosa di simile al seguente:

DateTime dateTimeToConvert = DateTime.Now; 
TimeSpan tsElapsed = dateTimeToConvert - DateTime.MinValue; 
return tsElapsed.TotalSeconds; 

Nota che tsElapsed.TotalSeconds è un doppio, non un Int.

Problemi correlati