betacode

Руководство 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

Класс JapaneseEra представляет собой эру (era) в японской императорской календарной системе, которая используется в основном в этой стране.
В принципе, эра в японской императорской календарной системе соответствует периоду правления короля. Когда начинается эра, год будет пронумерован начиная с 1, день и месяц останутся неизменными и будут такими же, как в календарной системе ISO.
public final class JapaneseEra implements Era, Serializable
Для простоты давайте взглянем на иллюстрацию ниже:
Император Akihito правил Японией с 8 января 1989 года по 30 апреля 2019 года. Период его правления известен как эпоха Heisei (Heisei era). Когда начнется новая эра, год будет пронумерован, начиная с 1, день и месяц не меняются.
Таким образом, согласно японскому императорскому календарю, первым днем эры Heisei было 8 января 01 года, а последним днем - 30 апреля 31 года.

2. Japanese Era List

В истории Японии существует множество династий, каждая из которых соответствует определенной эре (era). В этой статье я не намерен знакомить вас со всеми из них. Если вы заинтересованы, следующая статья будет вам полезна:
Первые календарные системы появились в Японии в 604 году на основе китайского лунного календаря. Эта календарная система просуществовала до конца 1872 года, прежде чем ее заменила календарная система Gregorian (также известна как ISO). Японская императорская календарная система периода до 1 января 1873 года не поддерживается Java.
Список поддерживаемых эпох в 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
Период с 23 октября 1868 года по 29 июля 1912 года был периодом правления императора Meiji. Его настоящее имя было Mutsuhito (3 декабря 1852 - 30 июля 1912). Это была первая половина Японской империи, когда японцы превратились из изолированного феодального общества, находящегося под угрозой вторжения Запада, в современную индустриальную столичную страну.
В эпоху Meiji календарная система претерпела серьезные изменения:
С 23 октября 1868 года по 31 декабря 1872 года: Япония использовала имперскую календарную систему с днем и месяцем, основанными на лунном календаре, но годы были пронумерованы в соответствии с возрастом текущей эры. (Java не поддерживает этот период)
С 1 января 1973 года по настоящее время: Япония поддерживает 2 календарные системы, Gregorian и улучшенную имперскую календарную систему (Дни и месяцы основаны на календаре Gregorian, но годы пронумерованы в зависимости от возраста текущей эры).
JapaneseEra.TAISHO
30 июля 1912 года умер император Meiji. Наследный принц Yoshihito (31 августа 1879 – 25 декабря 1926) стал императором и открыл эру Taisho с 30 июля 1912 по 24 декабря 1926 года. Taisho означает "великая праведность" (great righteousness).
JapaneseEra.SHOWA
Император Shōwa (29 апреля 1901 - 7 января 1989), настоящее имя которого Hirohito. Он был 124-м императором Японии, правившим Японией с 25 декабря 1926 года по 7 января 1989 года.
JapaneseEra.HEISEI
Император Heisei родился 23 декабря 1933 года, настоящее имя которого Akihito, и он является первым сыном императора Shōwa. 8 января 1989 года он стал императором и правил Японией до 30 апреля 2019 года. По-японски Хэйсэй означает "мир повсюду" (peace everywhere).
JapaneseEra.REIWA
30 апреля 2019 года император Heisei отрекся от престола из-за проблем со здоровьем, его сын Naruhito взошел на престол и стал 126-м императором Японии. Он назвал эпоху Reiwa, что означает "прекрасная гармония" (beautiful harmony). Эпоха Reiwa началась 1 мая 2019 года и является нынешней эпохой Японии.

3. JapaneseEra Examples

Следующий класс JapaneseEraUtils предоставляет служебные методы, которые помогут вам найти первую и последнюю дату в указанную эру (era) :
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.
        }
    }
}
Например: Выведите первый и последний день каждой эры (era) в системе японского императорского календаря, поддерживаемой 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)