Le Tutoriel de Java JapaneseDate
1. JapaneseDate
JapaneseDate est une classe représentant les dates dans le système de calendrier impérial japonais, qui est principalement utilisé dans ce pays. Aujourd'hui, bien que le Japon utilise le système de calendrier ISO, le système de calendrier impérial est toujours utilisé dans les événements culturels et les festivals.
public final class JapaneseDate
extends ChronoLocalDateImpl<JapaneseDate>
implements ChronoLocalDate, Serializable
- LocalDate
- ThaiBuddhistDate
- MinguoDate
- HijrahDate
- TemporalAdjuster
- Temporal
- TemporalAccessor
- ChronoLocalDate
Le système de calendrier impérial japonais est similaire au système de calendrier ISO. La différence est qu'il utilise l'ère pour compter les années.
Pour une meilleure compréhension, voir l'illustration ci-dessus. L'empereur Akihito a régné sur le Japon du 8 janvier 1989 au 30 avril 2019. La période de son règne est connue sous le nom de l'ère Heisei. Lorsqu'une nouvelle ère commence, l'année sera numérotée à partir de 1, le jour et le mois sont les mêmes que le jour et le mois dans le système de calendrier ISO.
JapaneseDate_Heisei_ex1.java
LocalDate isoDate_heisei_start = LocalDate.of(1989, 1, 8);
JapaneseDate jpDate_heisei_start = JapaneseDate.from(isoDate_heisei_start);
System.out.println("ISO Date Heisei era start: " + isoDate_heisei_start);
System.out.println("Japanese Date Heisei era start: " + jpDate_heisei_start);
System.out.println(" > YEAR: " + jpDate_heisei_start.get(ChronoField.YEAR));
System.out.println(" > YEAR_OF_ERA: " + jpDate_heisei_start.get(ChronoField.YEAR_OF_ERA));
LocalDate isoDate_heisei_end = LocalDate.of(2019, 4, 30);
JapaneseDate jpDate_heisei_end = JapaneseDate.from(isoDate_heisei_end);
System.out.println("\nISO Date Heisei era end: " + isoDate_heisei_end);
System.out.println("Japanese Date Heisei era end: " + jpDate_heisei_end);
System.out.println(" > YEAR: " + jpDate_heisei_end.get(ChronoField.YEAR));
System.out.println(" > YEAR_OF_ERA: " + jpDate_heisei_end.get(ChronoField.YEAR_OF_ERA));
Output:
ISO Date Heisei era start: 1989-01-08
Japanese Date Heisei era start: Japanese Heisei 1-01-08
> YEAR: 1989
> YEAR_OF_ERA: 1
ISO Date Heisei era end: 2019-04-30
Japanese Date Heisei era end: Japanese Heisei 31-04-30
> YEAR: 2019
> YEAR_OF_ERA: 31
Le 30 avril 2019, l'empereur Akihito a officiellement abdiqué pour des raisons de santé, ce qui est le dernier jour de l'ère Heisei. Un jour après, c'est-à-dire le 1er mai 2020, son fils Naruhito intronisa et inaugura une nouvelle ère appelée Reiwa.
On verra ce qui se passe lorsqu'on ajoute un jour au dernier jour de l'ère Heisei :
JapaneseDate_Reiwa_ex1.java
LocalDate isoDate_heisei_end = LocalDate.of(2019, 4, 30);
JapaneseDate jpDate_heisei_end = JapaneseDate.from(isoDate_heisei_end);
System.out.println("ISO Date Heisei era end: " + isoDate_heisei_end);
System.out.println("Japanese Date Heisei era end: " + jpDate_heisei_end);
// Plus 1 day to jpDate_heisei_end:
JapaneseDate jpDate_new = jpDate_heisei_end.plus(1, ChronoUnit.DAYS);
System.out.println("\nAfter adding 1 day: " + jpDate_new);
Output:
ISO Date Heisei era end: 2019-04-30
Japanese Date Heisei era end: Japanese Heisei 31-04-30
After adding 1 day: Japanese Reiwa 1-05-01
En Java, le système de calendrier impérial japonais commence par la date "Japanese Meiji 6-01-01", qui équivaut au 1er janvier 1873 dans le système de calendrier ISO. Les dates précédentes ne sont pas prises en charge.
JapaneseDate_supported_range_ex1.java
JapaneseDate now = JapaneseDate.now();
// Range of ISO years.
ValueRange yearRange = now.range(ChronoField.YEAR);
System.out.println(yearRange); // 1873 - 999999999
JapaneseDate jpDate = JapaneseDate.from(LocalDate.of(1873, 1, 1));
System.out.println(jpDate); // Japanese Meiji 6-01-01
L'article sur JapaneseEra vous donne une liste des époques prises en charge par Java dans le système de calendrier impérial japonais :
- Era
- JapaneseEra
2. JapaneseDate Examples
La classe JapaneseDateUtils suivante fournit des méthodes utilitaires pour vous aider à trouver la première et la dernière date d'une ère spécifiée :
JapaneseDateUtils.java
package org.o7planning.japanesedate.util;
import java.time.chrono.JapaneseDate;
import java.time.chrono.JapaneseEra;
import java.time.temporal.ChronoField;
import java.time.temporal.ChronoUnit;
import java.time.temporal.ValueRange;
public class JapaneseDateUtils {
public static final JapaneseDate FIRST_SUPPORTED_JP_DATE = JapaneseDate.of(JapaneseEra.MEIJI, 6, 1, 1);
public static JapaneseDate getFirstDateInSameEra(final JapaneseDate japaneseDate) {
final JapaneseEra thisEra = japaneseDate.getEra();
// Valid Japanese Year range with the same given day & month & era.
ValueRange validYearRange = japaneseDate.range(ChronoField.YEAR_OF_ERA); // Ex: 1-64
// Valid Min Japanese year with the same given day & month
int validMinYear = (int) validYearRange.getMinimum(); // 1
if (thisEra.equals(JapaneseEra.MEIJI)) {
if (validMinYear < 6) {
validMinYear = 6;
}
}
final JapaneseDate jpDate2 = JapaneseDate.of(thisEra, validMinYear, 12, 31);
ValueRange dayOfY2 = jpDate2.range(ChronoField.DAY_OF_YEAR);
// First date in the same year with jpDate2.
final JapaneseDate jpDate3 = jpDate2.minus(dayOfY2.getMaximum() - dayOfY2.getMinimum(), ChronoUnit.DAYS);
if (!jpDate3.isAfter(FIRST_SUPPORTED_JP_DATE)) {
return jpDate3;
}
final JapaneseDate jpDate4 = jpDate3.minus(1, ChronoUnit.DAYS);
final JapaneseEra era4 = jpDate4.getEra();
if (!thisEra.equals(era4)) {
return jpDate3;
}
ValueRange dayOfY4 = jpDate4.range(ChronoField.DAY_OF_YEAR);
// First date in the same Era with given japaneseDate.
final JapaneseDate jpDate5 = jpDate4.minus(dayOfY4.getMaximum() - dayOfY4.getMinimum(), ChronoUnit.DAYS);
return jpDate5;
}
public static JapaneseDate getLastDateInSameEra(final JapaneseDate japaneseDate) {
final JapaneseEra thisEra = japaneseDate.getEra();
// Valid Japanese Year range with the same given day & month & era.
ValueRange validYearRange = japaneseDate.range(ChronoField.YEAR_OF_ERA); // Ex: 1-64
// Valid Max Japanese year with the same given day & month
int validMaxYear = (int) validYearRange.getMaximum(); // Ex: 64
final JapaneseDate jpDate2 = JapaneseDate.of(thisEra, validMaxYear, 1, 1);
ValueRange dayOfY2 = jpDate2.range(ChronoField.DAY_OF_YEAR);
// Last date in the same year with jpDate2.
final JapaneseDate jpDate3 = jpDate2.plus(dayOfY2.getMaximum() - dayOfY2.getMinimum(), ChronoUnit.DAYS);
final JapaneseDate jpDate4 = jpDate3.plus(1, ChronoUnit.DAYS);
final JapaneseEra era4 = jpDate4.getEra();
if (!thisEra.equals(era4)) {
return jpDate3;
}
ValueRange dayOfY4 = jpDate4.range(ChronoField.DAY_OF_YEAR);
// Last date in the same Era with given japaneseDate.
final JapaneseDate jpDate5 = jpDate4.plus(dayOfY4.getMaximum() - dayOfY4.getMinimum(), ChronoUnit.DAYS);
return jpDate5;
}
public static JapaneseDate getFirstDateInEra(final JapaneseEra era) {
JapaneseDate jpDate = FIRST_SUPPORTED_JP_DATE;
while (true) {
JapaneseEra jpEra = jpDate.getEra();
if (era.equals(jpEra)) {
return getFirstDateInSameEra(jpDate);
}
jpDate = getLastDateInSameEra(jpDate);
jpDate = jpDate.plus(1, ChronoUnit.DAYS); // First Date in next era.
}
}
public static JapaneseDate getLastDateInEra(final JapaneseEra era) {
JapaneseDate jpDate = FIRST_SUPPORTED_JP_DATE;
while (true) {
JapaneseEra jpEra = jpDate.getEra();
if (era.equals(jpEra)) {
return getLastDateInSameEra(jpDate);
}
jpDate = getLastDateInSameEra(jpDate);
jpDate = jpDate.plus(1, ChronoUnit.DAYS); // First Date in next era.
}
}
}
Par exemple : Trouver la première et la dernière date de la même époque avec une date donnée.
JapaneseDate_firstlast_date_ex1.java
LocalDate localDate = LocalDate.of(1970, 5, 20);
JapaneseDate japanseDate = JapaneseDate.from(localDate);
System.out.printf("JP Date: %s ~ ISO Date: %s%n%n", japanseDate, LocalDate.from(localDate));
JapaneseDate firstJPDate = JapaneseDateUtils.getFirstDateInSameEra(japanseDate);
JapaneseDate lastJPDate = JapaneseDateUtils.getLastDateInSameEra(japanseDate);
System.out.printf("The first JP Date: %s ~ ISO Date: %s%n", firstJPDate, LocalDate.from(firstJPDate));
System.out.printf("The last JP Date: %s ~ ISO Date: %s%n", lastJPDate, LocalDate.from(lastJPDate));
Output:
JP Date: Japanese Showa 45-05-20 ~ ISO Date: 1970-05-20
The first JP Date: Japanese Showa 1-12-25 ~ ISO Date: 1926-12-25
The last JP Date: Japanese Showa 64-01-07 ~ ISO Date: 1989-01-07
3. JapaneseDate methods
public static JapaneseDate now()
public static JapaneseDate now(ZoneId zone)
public static JapaneseDate now(Clock clock)
public static JapaneseDate of(JapaneseEra era, int yearOfEra, int month, int dayOfMonth)
public static JapaneseDate of(int prolepticYear, int month, int dayOfMonth)
public static JapaneseDate from(TemporalAccessor temporal)
// Inherited from ChronoLocalDate interface
public JapaneseChronology getChronology()
// Inherited from ChronoLocalDate interface
public JapaneseEra getEra()
// Inherited from ChronoLocalDate interface
public int lengthOfMonth()
// Inherited from ChronoLocalDate interface
public int lengthOfYear()
// Inherited from TemporalAccessor interface
public boolean isSupported(TemporalField field)
// Inherited from TemporalAccessor interface
public ValueRange range(TemporalField field)
// Inherited from TemporalAccessor interface
public long getLong(TemporalField field)
// Inherited from Temporal interface
public JapaneseDate with(TemporalField field, long newValue)
// Inherited from Temporal interface
public JapaneseDate with(TemporalAdjuster adjuster)
// Inherited from Temporal interface
public JapaneseDate plus(TemporalAmount amount)
// Inherited from Temporal interface
public JapaneseDate minus(TemporalAmount amount)
// Inherited from Temporal interface
public JapaneseDate plus(long amountToAdd, TemporalUnit unit)
// Inherited from Temporal interface
public JapaneseDate minus(long amountToAdd, TemporalUnit unit)
// Inherited from ChronoLocalDate interface
public final ChronoLocalDateTime<JapaneseDate> atTime(LocalTime localTime)
// Inherited from ChronoLocalDate interface
public ChronoPeriod until(ChronoLocalDate endDate)
// Inherited from ChronoLocalDate interface
public long toEpochDay()
// Inherited from Temporal interface
public long until(Temporal endExclusive, TemporalUnit unit)
Tutoriels Java Date Time
- Le Tutoriel de Java ZoneId
- Le Tutoriel de Java Temporal
- Le Tutoriel de Java Period
- Le Tutoriel de Java TemporalAdjusters
- Le Tutoriel de Java MinguoDate
- Le Tutoriel de Java TemporalAccessor
- Le Tutoriel de Java JapaneseEra
- Le Tutoriel de Java HijrahDate
- Le Tutoriel de Java Date, Time
- Qu'est-ce que l'heure d'été (DST)?
- Le Tutoriel de Java LocalDate
- Le Tutoriel de Java LocalTime
- Le Tutoriel de Java LocalDateTime
- Le Tutoriel de Java ZonedDateTime
- Le Tutoriel de Java JapaneseDate
- Le Tutoriel de Java Duration
- Le Tutoriel de Java TemporalQuery
- Le Tutoriel de Java TemporalAdjuster
- Le Tutoriel de Java ChronoUnit
- Le Tutoriel de Java TemporalQueries
Show More
- Tutoriels Java Web Service
- Tutoriels de programmation Java Servlet/JSP
- Tutoriels de JavaFX
- Tutoriels de programmation Java SWT
- Tutoriels Java Oracle ADF
- Java Basic
- Tutoriels de Java Collections Framework
- Tutoriels Java IO
- Tutoriels Struts2
- Tutoriels Spring Boot
- Tutoriels Spring Cloud
- Tutoriels Maven
- Tutoriels Gradle