devstory

Le Tutoriel de Java JapaneseEra

  1. JapaneseEra
  2. Japanese Era List
  3. JapaneseEra Examples
  4. of(int japaneseEra)
  5. valueOf(String japaneseEra)
  6. values()
  7. getValue()
  8. range(TemporalField)
  9. getDisplayName(TextStyle, Locale)

1. JapaneseEra

La classe JapaneseEra représente une ère dans le système de calendrier impérial japonais, un système de calendrier utilisé principalement dans ce pays.
En règle générale, une ère dans le système de calendrier impérial japonais correspond à la période de règne d'un empereur. Lorsqu'une ère commence, l'année sera numérotée à partir de 1, le jour et le mois restent inchangés et sont identiques au système de calendrier ISO.
public final class JapaneseEra implements Era, Serializable
Pour mieux comprendre, observer l'illustration ci-dessous :
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 d'ère Heisei. Lorsqu'une nouvelle ère commence, l'année sera numérotée à partir de 1, le jour et le mois ne changent pas.
Alors, selon le calendrier impérial japonais, le premier jour de l'ère Heisei était le 8 janvier 01 et le dernier jour était le 30 avril 31.

2. Japanese Era List

Il existe de nombreuses dynasties dans l'histoire du Japon, chacune correspondant à une époque. Dans cet article, je n'ai pas l'intention de les présenter tous. Si vous êtes intéressé, l'article suivant vous sera utile :
Les premiers systèmes de calendrier sont apparus au Japon à partir de 604 basés sur le calendrier lunaire chinois. Ce système de calendrier a existé jusqu'à la fin de 1872 avant d'être remplacé par le système de calendrier Gregorian (alias ISO). Le système de calendrier impérial japonais de la période avant le 1er janvier 1873 n'est pas pris en charge par Java.
Liste des ères prises en charge en Java :
getValue()
Era Name
Emperor
ISO Date
From
To
-1
明治 (Meiji)
Mutsuhito
1868-09-08
1873-01-01(*)
1912-07-29
0
大正 (Taisho)
Yoshihito
1912-07-30
1926-12-24
1
昭和 (Showa)
Hirohito
1926-12-25
1989-01-07
2
平成 (Heisei)
Akihito
1989-01-08
2019-04-30
3
令和 (Reiwa)
Naruhito
2019-05-01
present
JapaneseEra.MEIJI
La période du 23 octobre 1868 au 29 juillet 1912 était le règne de l'empereur Meiji. Son vrai nom était Mutsuhito (3 décembre 1852 - 30 juillet 1912). C'était la première moitié de l'empire japonais lorsque les Japonais se sont transformés d'une société féodale isolée en danger d'être envahie par l'Occident en un pays capital industriel moderne.
Pendant l'ère Meiji, le système de calendrier a subi un changement majeur :
Du 23 octobre 1868 au 31 décembre 1872 : le Japon utilisait un système de calendrier impérial avec jour et mois basé sur le calendrier lunaire, mais les années étaient numérotées en fonction de l'âge de l'ère actuelle. (Java ne prend pas en charge cette étape)
Du 1er janvier 1973 à nos jours : le Japon maintient 2 systèmes de calendrier, le système de calendrier Gregorian et le système de calendrier impérial amélioré (le jour et le mois sont basés sur le calendrier Gregorian mais les années sont numérotées en fonction de l'âge de l'ère actuelle).
JapaneseEra.TAISHO
Le 30 juillet 1912, l'empereur Meiji est décédé. Le prince héritier Yoshihito (31 août 1879 – 25 décembre 1926) devint empereur et inaugura l'ère Taisho du 30 juillet 1912 au 24 décembre 1926. Taisho signifie "grande justice" (great righteousness).
JapaneseEra.SHOWA
Empereur Shōwa (29 avril 1901 - 7 janvier 1989), de son vrai nom Hirohito. Il était le 124e empereur du Japon, régnant sur le Japon du 25 décembre 1926 au 7 janvier 1989.
JapaneseEra.HEISEI
L'empereur Heisei est né le 23 décembre 1933, de son vrai nom Akihito et est le premier fils de l'empereur Shōwa. Le 8 janvier 1989, il devient empereur et dirige le Japon jusqu'au 30 avril 2019. En japonais, Heisei signifie "la paix partout".
JapaneseEra.REIWA
Le 30 avril 2019, l'empereur Heisei a abdiqué en raison de problèmes de santé, son fils Naruhito a intronisé et est devenu le 126e empereur du Japon. Il a nommé l'ère Reiwa, ce qui signifie "belle harmonie". L'ère Reiwa a commencé le 1er mai 2019 et est l'ère actuelle du Japon.

3. JapaneseEra Examples

La classe JapaneseEraUtils suivante fournit des méthodes utilitaires qui vous aident à trouver la première et la dernière date d'une ère spécifiée :
JapaneseEraUtils.java
package org.o7planning.japaneseera.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 JapaneseEraUtils {
    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 : Imprimer le premier et le dernier jour de chaque ère dans le système de calendrier impérial japonais pris en charge par Java.
JapaneseEra_printAllEras_ex1.java
for (JapaneseEra era : JapaneseEra.values()) {
    JapaneseDate jpFirstDate = JapaneseEraUtils.getFirstDateInEra(era);
    JapaneseDate jpLastDate = JapaneseEraUtils.getLastDateInEra(era);

    System.out.printf("Era: %s, era.getValue(): %d%n", era, era.getValue());
    System.out.printf(" >> First Date: %s ~ ISO Date: %s%n", jpFirstDate, LocalDate.from(jpFirstDate));
    System.out.printf(" >> Last Date: %s ~ ISO Date: %s%n%n", jpLastDate, LocalDate.from(jpLastDate));
}
Output:
Era: Meiji, era.getValue(): -1
 >> First Date: Japanese Meiji 6-01-01 ~ ISO Date: 1873-01-01
 >> Last Date: Japanese Meiji 45-07-29 ~ ISO Date: 1912-07-29

Era: Taisho, era.getValue(): 0
 >> First Date: Japanese Taisho 1-07-30 ~ ISO Date: 1912-07-30
 >> Last Date: Japanese Taisho 15-12-24 ~ ISO Date: 1926-12-24

Era: Showa, era.getValue(): 1
 >> First Date: Japanese Showa 1-12-25 ~ ISO Date: 1926-12-25
 >> Last Date: Japanese Showa 64-01-07 ~ ISO Date: 1989-01-07

Era: Heisei, era.getValue(): 2
 >> First Date: Japanese Heisei 1-01-08 ~ ISO Date: 1989-01-08
 >> Last Date: Japanese Heisei 31-04-30 ~ ISO Date: 2019-04-30

Era: Reiwa, era.getValue(): 3
 >> First Date: Japanese Reiwa 1-05-01 ~ ISO Date: 2019-05-01
 >> Last Date: Japanese Reiwa 292276977-04-04 ~ ISO Date: +292278995-04-04

4. of(int japaneseEra)

public static JapaneseEra of(int japaneseEra)

5. valueOf(String japaneseEra)

public static JapaneseEra valueOf(String japaneseEra)

6. values()

public static JapaneseEra[] values()

7. getValue()

public int getValue()

8. range(TemporalField)

public ValueRange range(TemporalField field)

9. getDisplayName(TextStyle, Locale)

public String getDisplayName(TextStyle style, Locale locale)