2015-01-21 10 views
7

Sto provando a formattare alcune date precise, convertendole da un timestamp Unix a un oggetto DateTime. Ho notato che il metodo AddSeconds ha un sovraccarico che accetta un numero in virgola mobile..NET DateTime sta troncando i miei secondi?

La mia aspettativa è che possa passare un numero come 1413459415.93417 e mi darà un oggetto DateTime con precisione a livello tick. Si tratta di un presupposto decente, o does the AddSeconds method still provide no better than millisecond precision? Nella conversione, devo aggiungere io stesso le spunte?

mio codice di conversione è qui sotto:

public static DateTime CalendarDateFromUnix(double unixTime) 
    { 
     DateTime calendarTime = UnixEpoch.AddSeconds(unixTime); 
     return calendarTime; 
    } 

mi aspetto di formattare il ToString di questa data come 16 Oct 2014 11:36:55.93417 utilizzando la stringa di formato qui sotto:

dd MMM yyyy HH:mm:ss.fffff 

Invece di darmi 16 Oct 2014 11:36:55.93417, sta dando me 16 Oct 2014 11:36:55.93400

Sto facendo qualcosa di sbagliato o .NET tronca la mia rappresentazione in virgola mobile? Sono nuovo di. NET, quindi il primo è del tutto possibile.

Grazie

+0

[Stato-rotto-by-design] – CodesInChaos

risposta

11

Dalla documentazione di DateTime.AddSeconds:

Il parametro valore viene arrotondato al millesimo di secondo più vicino.

Un'alternativa sarebbe quella di moltiplicare per TimeSpan.TicksPerSecond e quindi aggiungere che le zecche di UnixEpoch:

return new DateTime(
    UnixEpoch.Ticks + (long) (unixTime * Timespan.TicksPerSecond), 
    DateTimeKind.Utc); 
+0

Grazie, Jon. Devo averlo perso nei documenti. Hai idea del motivo per cui Microsoft non implementa una conversione alle misure più precise nell'oggetto DateTime? Anche difficile è banale da implementare manualmente, penso che la funzionalità dovrebbe essere lì. Dopotutto, non è C# tutto sul risparmio di tempo per gli sviluppatori? – CanadaIT

+0

@CanadaIT: I * sospetto * è perché è facile finire con valori secondari che in realtà non si vogliono a causa dell'imprecisione 'double'. Non sono sicuro però. Se stai cercando un'API data/ora migliore per .NET, potresti voler dare un'occhiata al mio progetto [Noda Time] (http://nodatime.org) :) –