2015-01-21 7 views
7

Ich versuche, einige genaue Daten zu formatieren, um sie von einem Unix-Zeitstempel zu einem DateTime-Objekt zu konvertieren. Ich habe festgestellt, dass die AddSeconds-Methode eine Überladung aufweist, die eine Fließkommazahl akzeptiert.Ist .NET DateTime meine Sekunden abgeschnitten?

Meine Erwartung ist, dass ich eine Zahl wie 1413459415.93417 übergeben kann und es mir ein DateTime-Objekt mit Tick-Level-Genauigkeit geben wird. Ist das eine anständige Annahme, oder does the AddSeconds method still provide no better than millisecond precision? Muss ich in der Konvertierung die Ticks selbst hinzufügen?

Mein Conversion-Code ist unten:

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

Ich erwarte, dass der ToString dieses Datums zu formatieren, wie 16 Oct 2014 11:36:55.93417 unter dem Formatstring mit:

dd MMM yyyy HH:mm:ss.fffff 

Statt mir 16 Oct 2014 11:36:55.93417 geben, es gibt me 16 Oct 2014 11:36:55.93400

Mache ich etwas falsch oder ist .NET meine Floating-Point-Sekunden-Darstellung abgeschnitten? Ich bin neu in .NET, also ersteres ist durchaus möglich.

Dank

+0

[Status-gebrochen-by-design] – CodesInChaos

Antwort

11

Aus der Dokumentation von DateTime.AddSeconds:

Der Parameterwert auf die nächste Millisekunde gerundet.

Eine Alternative wäre von TimeSpan.TicksPerSecond zu multiplizieren und dann die von UnixEpoch zu den Zecken hinzufügen:

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

Danke, Jon. Ich muss das in den Unterlagen verpasst haben. Haben Sie eine Idee, warum Microsoft keine Konvertierung in die präziseren Messungen im DateTime-Objekt implementiert? Auch wenn es einfach ist, es manuell zu implementieren, denke ich, dass die Funktionalität vorhanden sein sollte. Schließlich geht es bei C# nicht darum, Entwicklerzeit einzusparen? – CanadaIT

+0

@ CanadaIT: Ich * verdächtige * es ist, weil es leicht ist, mit Sub-Sekunden-Werten zu enden, die Sie wegen "doppelter" Ungenauigkeit wirklich nicht wollen. Nicht sicher, obwohl. Wenn Sie nach einer besseren Datum/Zeit-API für .NET suchen, sollten Sie sich vielleicht mein Projekt [Noda Time] (http://nodatime.org) ansehen :) –