Что делает Calendar.UNDECIMBER?
В константе есть Calendar
класс называется: UNDECIMBER
, Это описывает 13-й месяц.
Есть ли полезная цель для этой константы? В википедии написано, что это для лунного календаря. Но нет реализации для такого календаря.
И существуют ли какие-либо решения для 14-го месяца (Duodecimber)?
Я не нашел так много в сети, и я хотел бы узнать больше об этой теме.
2 ответа
Как уже говорилось, некоторые лунные (и другие древние) календари имеют 13 месяцев. Одним из примеров является коптский календарь.
Хотя нет реализаций календарей с 13 месяцами, которые расширяются java.util.Calendar
в новом API Java 8 есть некоторые. С введением нового API java.time был также создан проект ThreeTen Extra, который содержит реализацию для этого.
Класс org.threeten.extra.chrono.CopticChronology
, который расширяет родной java.time.chrono.Chronology
, Я только что сделал пример кода, чтобы создать дату в этом календаре и просмотреть все месяцы:
// Coptic calendar
CopticChronology cal = CopticChronology.INSTANCE;
// range for month of year (from 1 to 13)
System.out.println("month range: " + cal.range(ChronoField.MONTH_OF_YEAR)); // 1 - 13
// getting a date in Coptic calendar and loop through the months
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("dd/MM/yyyy");
// September 11th is equivalent to 01/01 in Coptic calendar
CopticDate d = cal.date(LocalDate.of(2017, 9, 11));
for (int i = 0; i < 14; i++) {
System.out.println(fmt.format(d));
d = d.plus(1, ChronoUnit.MONTHS);
}
Выход:
month range: 1 - 13
01/01/1734
01/02/1734
01/03/1734
01/04/1734
01/05/1734
01/06/1734
01/07/1734
01/08/1734
01/09/1734
01/10/1734
01/11/1734
01/12/1734
01/13/1734
01/01/1735
Обратите внимание, что год изменился сразу после 13-го месяца.
В проекте ThreeTen Extra также есть реализация эфиопского календаря, который также рассчитан на 13 месяцев.
И, как пример календаря с 14 месяцами, есть PaxChronology
Класс, который реализует Календарь Pax: предложенная система календаря реформ, но в настоящее время не используется, насколько я знаю.
Цитирование википедии:
Общий год делится на 13 месяцев по 28 дней каждый, имена которых такие же, как в григорианском календаре, за исключением того, что месяц с названием Колумбус происходит между ноябрем и декабрем. Первый день каждой недели, месяца и года будет воскресенье.
В високосные годы после Колумба вводится недельный месяц, называемый Пакс.
И в соответствии с Javadoc:
Високосные годы происходят в каждом году, последние две цифры которого делятся на 6, равны 99 или 00, а год не делится на 400.
Пример:
PaxChronology paxCal = PaxChronology.INSTANCE;
System.out.println("month range: " + paxCal.range(ChronoField.MONTH_OF_YEAR));
PaxDate pd = paxCal.date(1930, 1, 1);
for (int i = 0; i < 15; i++) {
// fmt is the same DateTimeFormatter from previous example
System.out.println(fmt.format(pd));
// adjusting for first day of next month - using TemporalAdjuster because
// adding 1 ChronoUnit.MONTHS throws an exception for 14th month (not sure why)
pd = pd.plus(30, ChronoUnit.DAYS).with(TemporalAdjusters.firstDayOfMonth());
}
Выход:
month range: 1 - 13/14
01/01/1930
01/02/1930
01/03/1930
01/04/1930
01/05/1930
01/06/1930
01/07/1930
01/08/1930
01/09/1930
01/10/1930
01/11/1930
01/12/1930
01/13/1930
01/14/1930
01/01/1931
Вы можете заметить, что год меняется после 14-го месяца. Диапазон 1 - 13/14
потому что годы могут иметь 13 или 14 месяцев, в зависимости от того, високосный год или нет.
Calendar.UNDECIMBER
является дополнительной константой в классе Calendar, которая обычно не используется в широко используемом григорианском календаре, но некоторые лунные календари используют 13-й месяц. Это цель этого поля.
Обратитесь к документации Java ниже:
https://docs.oracle.com/javase/7/docs/api/java/util/Calendar.html
Статья в Википедии для этого:
https://en.wikipedia.org/wiki/Undecimber
Также есть упоминание о 14-м месяце - Duodecimber в вики. К сожалению, Java пока не поддерживает это.
Надеюсь это поможет!