Puis-je utiliser la Bibliothèque de Temps Java pour Convertir des Dates Juliennes Contenant à la fois la Date et l'Heure?


J'essaie de mettre à jour le code Java astronomique hérité pour utiliser la bibliothèque de temps Java. Le code hérité utilise Date / Calendrier / Calendrier Grégorien / Fuseau horaire et une bibliothèque de jours juliens.

Je voudrais convertir les dates juliennes en UTC (par exemple 2458808.343055) en date/heure "locale" + décalage UTC (pour éviter les fuseaux horaires et les règles DST), pour trouver quand elles correspondent (à la seconde).

Si je comprends bien, Threeten-Extra prend en charge uniquement les nombres de Jour julien (date), mais pas le fractionnaire partie (heure de la journée), donc je suppose que je vais devoir m'en tenir à une bibliothèque Julian Day séparée qui gère ces derniers.

Est-ce exact?

Author: JerseyP, 2019-11-27

2 answers

J'ai utilisé votre exemple Julian Date (2458808.343055) et comparé deux versions différentes de Julian days en utilisant ma bibliothèque Time4J:

    double input = 2458808.343055;
    JulianDay jd = JulianDay.ofEphemerisTime(input); // used by astronomers
    System.out.println(jd.toMoment().toZonalTimestamp(ZonalOffset.UTC).toTemporalAccessor());
    // output of LocalDateTime: 2019-11-20T20:12:50.767995849

    JulianDay jdSimple = JulianDay.ofSimplifiedTime(input); // naive approach
    System.out.println(jdSimple.toMoment().toZonalTimestamp(ZonalOffset.UTC).toTemporalAccessor());
    // output of LocalDateTime: 2019-11-20T20:13:59.951995849

La différence est supérieure à une minute complète. La prise en charge de l'échelle TT (temps des éphémérides) nécessite une prise en charge de la gestion des secondes bissextiles qui n'est disponible que dans Time4J mais pas dans Java standard. Voir aussi la définition officielle des jours juliens par l'UAI (page 7).

Note latérale: L'appel toTemporalAccessor() peut être omis sauf si vous voulez obtenir un objet de type LocalDateTime pour satisfaire vos interfaces.

 1
Author: Meno Hochschild, 2019-12-11 03:50:23

MISE À JOUR Code fixe pour ajuster les dates juliennes avec des heures commençant à midi, et pour la précision de la milliseconde.

Pour la prise en charge de la date Julian, vous devez ajouter la bibliothèque ThreeTen-Extra, qui a le JulianChronology mise en œuvre.

Vous pouvez alors le faire comme ceci:

double julianDay = 2458808.343055;

JulianDate julianDate = JulianDate.now().with(JulianFields.JULIAN_DAY, (long) (julianDay + .5));
LocalTime julianTime = LocalTime.ofNanoOfDay(Math.round((julianDay + .5) % 1 * 8.64e7) * 1000000);
Instant instant = julianDate.atTime(julianTime).toInstant(ZoneOffset.UTC);
OffsetDateTime localDateTimeWithOffset = instant.atZone(ZoneId.systemDefault()).toOffsetDateTime();

System.out.println(julianDate);
System.out.println(julianTime);
System.out.println(instant);
System.out.println(localDateTimeWithOffset);

Sortie

Julian AD 2019-11-07
20:13:59.952
2019-11-20T20:13:59.952Z
2019-11-20T15:13:59.952-05:00

La dernière valeur est parce que je suis dans le fuseau horaire de l'Est des États-Unis.

 0
Author: Andreas, 2019-11-27 02:55:19