Руководство Java HijrahDate
1. HijrahDate
Класс HijrahDate представляет даты в календарной системе Hijrah, широко известной как исламский или арабский календарь, которая представляет собой календарную систему, основанную на лунном календаре, состоящую из 12 лунных месяцев с 354 или 355 днями. Он используется для определения исламских праздников, таких как ежегодный период поста или событие Hijrah.

- JapaneseDate
- MinguoDate
- ThaiBuddhistDate
- LocalDate
- LocalDate
- Temporal
- TemporalAdjuster
- TemporalAccessor
- ChronoLocalDate
В исламском календаре используется эра Hijrah (Hijrah era), которая соответствует 622 году по календарю Gregorian (также известному как ISO). В том году Muhammad и его последователи мигрировали из Mecca в Yathrib (ныне Medina) и основали первую мусульманскую общину, событие, отмечаемое как Hijrah. На Западе эта эра часто обозначается AH (Anno Hegirae по-латыни). В мусульманских странах он также иногда обозначается H. На английском языке период до Hijrah обозначается BH (Before Hijrah).
1 января 1-го года по календарю Hijrah соответствует 16 июля 622 года. Следующий Website предоставляет онлайн-инструмент, который поможет вам конвертировать даты в календаре Hijrah в календарь Gregorian и наоборот:
Gregorian (ISO) | Hijrah |
622-07-16 | 1-01-01 |
2000-01-01 | 1420-09-24 |
Year
Год по исламскому календарю состоит примерно из 354 или 355 дней, что на 11 дней короче, чем по календарю Gregorian.
Приблизительная формула для преобразования календарного года Hijrah (AH) в календарный год Gregorian (CE) и наоборот:
AH = (CE − 622) × 33 ÷ 32
CE = AH + 622 − (AH ÷ 32)
Month
Исламский календарь состоит из 12 месяцев с 29 или 30 днями. Если Полумесяц виден вскоре после захода солнца вечером 29-го дня, то следующий день - первый день нового месяца. Если наблюдение не производится, к текущему месяцу добавляется 30-й день, за которым следует первый день следующего месяца.

Традиционная версия исламского календаря требует, чтобы уполномоченное лицо или комитет проводили фактическое наблюдение Полумесяца для определения продолжительности каждого месяца.
Эта зависимость от астрономических наблюдений затрудняет прогнозирование продолжительности исламских месяцев. Облака и другие неблагоприятные атмосферные условия могут заслонить видимый в противном случае Полумесяц Луны. Когда это произойдет, месяц может быть продлен на один день, задерживая как начало нового месяца, так и связанные с ним события. Вот почему даты мусульманских праздников могут измениться в кратчайшие сроки.
Некоторые страны и мусульманские общины в настоящее время используют модифицированные версии традиционного календаря, которые предназначены для облегчения прогнозирования сроков исламских месяцев и праздников.
Новый месяц также может начинаться в разные дни в разных странах. Поскольку время захода луны в том или ином месте зависит от его долготы, новый месяц и ключевые религиозные ритуалы, такие как пост Ramadan, могут начаться на день раньше, например, в мусульманских странах Западной Африки, чем в Индонезии или Малайзии.
Названия месяцев в календаре Hijrah:
Months | ISO Months | Hijrah Months |
1 | January | Muharram |
2 | February | Safar |
3 | March | Rabi Al-Awwal |
4 | April | Rabi Al-Thani |
5 | May | Jumada Al-Awwal |
6 | June | Jumada Al-Thani |
7 | July | Rajab |
8 | August | Sha`ban |
9 | September | Ramadan |
10 | October | Shawwal |
11 | November | Dhul-Qa`dah |
12 | December | Dhul-Hijjah |
Названия дней недели:
English Day-Of-Week | Hijrah Day-Of-Week | |
1 | Sunday | Al-Ahad |
2 | Monday | Al-Ithnayn |
3 | Tuesday | Al-Thulathaa |
4 | Wednesday | Al-Arbo’aa |
5 | Thursday | Al-Khamees |
6 | Friday | Al-Jum’ah |
7 | Saturday | Al-Sabt |
Подробнее см. объяснение названий каждого месяца и дня недели в календарной системе Hijrah:
2. Basic Example
В принципе, исламский календарь имеет множество вариаций, причина в том, что его используют многие страны и многие секты. Класс HijrahDate поддерживает несколько из них, важно то, что Java позволяет настраивать его для добавления новых вариантов.
Вариант по умолчанию, поддерживаемый в Java - "islamic-umalqura":исламский календарь Umm Al-Qura Саудовской Аравии. (Подробнее см. Класс HijrahChronology для получения более подробной информации).
- Руководство Java HijrahChronology
Для удобства понимания давайте проанализируем приведенный ниже пример (используя вариант исламского календаря по умолчанию):
HijrahDate_default_variant_ex1.java
LocalDate localDate = LocalDate.of(2000, 1, 1);
HijrahDate hijrahDate = HijrahDate.from(localDate);
System.out.printf("localDate: %s%n", localDate); // 2000-01-01
System.out.printf("hijrahDate: %s%n%n", hijrahDate); // Hijrah-umalqura AH 1420-09-24
HijrahEra era = hijrahDate.getEra(); // HijrahEra.AH
System.out.printf(" > era.name(): %s%n%n", era.name()); // AH
HijrahChronology chronology = hijrahDate.getChronology();
System.out.printf(" > chronology.getId(): %s%n", chronology.getId()); // Hijrah-umalqura
System.out.printf(" > chronology.getCalendarType(): %s", chronology.getCalendarType()); // islamic-umalqura
Output:
localDate: 2000-01-01
hijrahDate: Hijrah-umalqura AH 1420-09-24
> era.name(): AH
> chronology.getId(): Hijrah-umalqura
> chronology.getCalendarType(): islamic-umalqura

Текст, представляющий HijrahDate, состоит из 3 частей:
Chronology ID:
(Идентификатор хронологии): Позволяет указать, какой вариант использовать. Календарные системы Gregorian (ISO) и Japanese не имеют различий, поэтому эта информация не отображается.
Era Name:
(Название эры): Поддерживается только одна эра, которая называется HijrahEra.AH.
Date:
Информация о дате.
3. Supported Range Example
Хотя на практике система календаря Hijrah не ограничивает диапазон дат, но Java поддерживает ее лишь в небольшой степени, а именно:
(**) Test with Java 11. | ||
Hijrah Date | ISO Date | |
From | Hijrah-umalqura AH 1300-01-01 | 1882-11-12 |
To | Hijrah-umalqura AH 1600-12-30 | 2174-11-25 |
Приведенный ниже пример используется для поиска наименьшей и наибольшей даты в системе календаря Hijrah, поддерживаемой Java.
HijrahDate_date_range_ex1.java
package org.o7planning.hijrahdate.ex;
import java.time.LocalDate;
import java.time.chrono.Chronology;
import java.time.chrono.HijrahChronology;
import java.time.chrono.HijrahDate;
import java.time.temporal.ChronoField;
import java.time.temporal.TemporalAdjusters;
import java.time.temporal.ValueRange;
public class HijrahDate_date_range_ex1 {
public static void main(String[] args) {
Chronology chronology = HijrahChronology.INSTANCE;
ValueRange range = chronology.range(ChronoField.YEAR);
int minYear = (int) range.getMinimum();
int maxYear = (int) range.getMaximum();
System.out.println("minYear: " + minYear);
System.out.println("maxYear: " + maxYear);
// ----- Find the first supported date --------
// A Hijrah Month have 29 or 30 days.
HijrahDate hijrahDate = null;
try {
hijrahDate = HijrahDate.of(minYear, 12, 30);
} catch (Exception e) {
hijrahDate = HijrahDate.of(minYear, 12, 29);
}
HijrahDate firstDate = hijrahDate.with(TemporalAdjusters.firstDayOfYear());
System.out.println("First date: " + firstDate + " --> " + LocalDate.from(firstDate));
// ----- Find the last supported date --------
hijrahDate = HijrahDate.of(maxYear, 1, 1);
hijrahDate.range(ChronoField.DAY_OF_YEAR);
HijrahDate lastDate = hijrahDate.with(TemporalAdjusters.lastDayOfYear());
System.out.println("Last date: " + lastDate + " --> " + LocalDate.from(lastDate));
}
}
Output:
minYear: 1300
maxYear: 1600
First date: Hijrah-umalqura AH 1300-01-01 --> 1882-11-12
Last date: Hijrah-umalqura AH 1600-12-30 --> 2174-11-25
4. Month Length Example
Например: Просмотр продолжительности месяцев в несколько лет (вариант по умолчанию - Исламский календарь Umm Al-Qura Саудовской Аравии).
HijrahDate_monthLength_ex1.java
int[] hijrahYears = new int[] { 1441, 1442, 1443, 1444, 1445 };
HijrahDate hijrahDate = HijrahDate.of(hijrahYears[0], 1, 1);
System.out.println("Hijrah Year: " + hijrahYears[0]); // 1441
System.out.println("ISO Year: " + LocalDate.from(hijrahDate).getYear()); // 2019
System.out.println();
for (int month = 1; month <= 12; month++) {
for (int hijrahYear : hijrahYears) {
hijrahDate = HijrahDate.of(hijrahYear, month, 1);
System.out.printf("Year: %s Month: %s --> %d%n", hijrahYear, month, hijrahDate.lengthOfMonth());
}
}
Output:
Year | 1441 | 1442 | 1443 | 1444 | 1445 |
Month | |||||
1 | 30 | 29 | 30 | 29 | 29 |
2 | 29 | 30 | 29 | 30 | 30 |
3 | 30 | 29 | 30 | 29 | 30 |
4 | 29 | 30 | 29 | 30 | 30 |
5 | 30 | 29 | 30 | 30 | 29 |
6 | 30 | 30 | 29 | 29 | 30 |
7 | 29 | 29 | 30 | 29 | 29 |
8 | 30 | 30 | 29 | 30 | 29 |
9 | 30 | 30 | 30 | 29 | 30 |
10 | 29 | 29 | 29 | 30 | 29 |
11 | 30 | 30 | 30 | 29 | 29 |
12 | 29 | 29 | 30 | 30 | 30 |
Руководства Java Date Time
- Руководство Java ZoneId
- Руководство Java Temporal
- Руководство Java Period
- Руководство Java TemporalAdjusters
- Руководство Java MinguoDate
- Руководство Java TemporalAccessor
- Руководство Java JapaneseEra
- Руководство Java HijrahDate
- Руководство Java Date Time
- Что такое летнее время (DST)?
- Руководство Java LocalDate
- Руководство Java LocalTime
- Руководство Java ZonedDateTime
- Руководство Java JapaneseDate
- Руководство Java Duration
- Руководство Java TemporalQuery
- Руководство Java TemporalAdjuster
- Руководство Java ChronoUnit
- Руководство Java TemporalQueries
Show More
- Руководства Java Web Services
- Руководства Java Servlet/JSP
- Руководства JavaFX
- Руководства Java SWT
- Руководства Oracle Java ADF
- Java Basic
- Руководства Java Collections Framework
- Руководства Java IO
- Руководства Struts2 Framework
- Руководства Spring Boot
- Руководства Spring Cloud
- Руководства Maven
- Руководства Gradle