Comment convertir une date grégorienne en date julienne avec l'API Java 8 Date/Heure?
J'ai une date dans le calendrier Grégorien et veulent regarder le même jour dans le calendrier Julien.
Cela devrait être facile avec l'API Date/Heure de Java 8 mais je n'ai pas trouvé de moyen de le faire. Le code devrait ressembler à ceci:
/*
* LocalDate uses the Gregorian calendar
*/
LocalDate date = LocalDate.parse("2017-10-29");
/*
* switch from Gregorian calendar to Julian calendar here
*/
;
/*
* output should be 2017-10-16
*/
System.out.println(date);
, que Vous pouvez essayer en ligne ici
Modifier
Ce n'est certainement pas un double de Convertir du calendrier grégorien en calendrier julien . Ma question pose spécifiquement sur l'API Java Data/Time.
2 answers
La chronologie julienne n'est pas intégrée dans Java 8 ou 9. Au lieu de cela, le projet ThreeTen-Extra a JulianChronology
et JulianDate
cours. Son utilisation est simple.
JulianDate jd = JulianDate.from(localIsoDate);
Je pense plutôt comme @Hugo que vos efforts de recherche auraient pu être meilleurs.
Java-8/9 prend-il en charge le calendrier julien?
Méthode de recherche: Veuillez étudier l'API officielle.
Le nombre de chronologies dans OpenJDK est limité à seulementcinq (voir les implémentations mentionnées). Aucune chronologie (ISO comme proleptique grégorien, Hijri-Umalquara, Minguo, ThaiBuddhist, Japonais) ne supporte le calendrier julien. D'où la réponse simple est: Pas depossibilité de convertir en calendrier julien uniquement en utilisant Java-8/9-API.
Oracle prévoit-il de mettre en œuvre le calendrier julien?
Méthode de recherche: Requête Google.
Une simple recherche en utilisant Google avec les mots-clés "openjdk calendrier julien" montre comme premier lien problème suivant:
Le système de calendrier julien était le principal système de calendrier utilisé avant l'actuel grégorien / ISO. En raison de sa répandu utilisation historique, en particulier dans le domaine historique / académique, le JDK doit être pris en charge.
Une implémentation est disponible sur ThreeTen-Extra. Notez que cette le problème n'appelle-t-il pas un calendrier qui peut "basculer" entre le Julien et Grégorien.
Ce problème a été soumis par l'auteur principal de new java.temps-API S. Colebourne déjà dans l'année 2015. Oracle avait eu beaucoup de temps pour ajouter l'implémentation finie suggérée à Java-9, mais raté. En ce qui concerne le fait qu'Oracle a refusé certains autres systèmes de calendrier (comme le persan ou l'hébreu) ou même jeté les chronologies existantes (comme Coptic qui faisait partie d'OpenJDK-8 avant sa sortie), Je ne serais pas très sûr si Oracle va vraiment ajouter le calendrier julien à une version Java ultérieure dans le contexte de java.time
-API. Voyons voir.
Pouvons-nous utiliser d'autres bibliothèques tierces pour convertir java.time.LocalDate
?
méthode de Recherche: Google requête.
Une simple recherche à l'aide de Google avec les mots-clés "java julian calendar" montre des tonnes de solutions possibles. Ayez juste un peu de patience pour étudier au moins les liens des 10 premières pages de résultats de recherche:
Oui, on peut.
Si vous voulez ou savez comment convertir
java.time.LocalDate
enjava.util.GregorianCalendar
(astuce: Utilisez le fuseau horaire pour convertir d'abord enZonedDateTime
puis en ancienne API): Définissez la date de transition grégorienne surnew Date(Long.MAX_VALUE)
.-
Ou utilisez Joda-Time: Il offre une chronologie julian . Exemple de conversion:
LocalDate threeten = LocalDate.now(); org.joda.time.LocalDate joda = new DateTime( threeten.getYear(), threeten.getMonthValue(), threeten.getDayOfMonth(), 0, 0 ).withChronology(JulianChronology.getInstance()).toLocalDate();
Ou utilisez Threeten-Extra (déjà suggéré par S. Colebourne dans le OpenJDK-issue et sa réponse ici sur SO qui montre également la conversion simple).
-
Ou utilisez ma bibliothèque Time4J qui offre même deux calendriers différents: JulianCalendar et
HistoricCalendar
(ce dernier a un ChronoHistory configurable pour le les années bissextiles juliennes irrégulières entre 44 avant JC et 8 après JC, voir la classeAncientJulianLeapYears ). Exemple de conversion:
LocalDate threeten = LocalDate.now(); JulianCalendar jcal = PlainDate.from(threeten).transform(JulianCalendar.axis());