J'essaie de convertir DateTime en date du calendrier Julien et de l’inverser sous Windows 7.
public static double ToJulianDate(this DateTime dt) {
return dt.ToOADate() + 2415018.5;
}
public static DateTime Julian2DT(this double julian) {
return DateTime.FromOADate(julian - 2415018.5);
}
Quand je teste ces deux fonctions comme ci-dessous
var dt = DateTime.Now;
dt.ToString("yyyy-MM-dd HH:mm:ss.ffffff").Dump();
dt.ToJulianDate().Julian2DT().ToString("yyyy-MM-dd HH:mm:ss.ffffff").Dump();
la date julienne inversée a toujours une valeur légèrement différente de la valeur DateTime d'origine de plusieurs centaines de microsecondes.
Ai-je écrit un code erroné ou des inexactitudes de quelques microsecondes dans le système de temps Windows?
Réponses:
1 pour la réponse № 1C’est un résultat naturel du fait que la date julienne est représentée comme un double
, qui aura toujours une précision limitée. Par exemple, la valeur actuelle est d'environ 2456348.78370906. Cela donne 7 chiffres significatifs avant la virgule décimale - et un double
est seulement précis à "environ" 15 décimales. Nous avons donc environ 8 chiffres décimaux d’exactitude dans la partie décimale ... ce qui est censé représenter un jour.
Maintenant, 1 jour / 100000000 = 0,000864 secondes. Donc, je ne m'attendais qu'à une précision d'un peu moins d'une milliseconde.
Si vous don "t ajoutez la constante pour une date julienne, ça a l'airplus rose - à ce stade, la valeur actuelle n’est que d’environ 41330, il ya donc plus de "marge de manœuvre" dans la valeur de précision par rapport à l’heure du jour. En gros, plus les valeurs en virgule flottante sont grandes, plus la précision est mauvaise en termes absolus (l'écart entre les valeurs adjacentes devient plus important).