betacode

Руководство Java HijrahDate

  1. HijrahDate
  2. Basic Example
  3. Supported Range Example
  4. Month Length Example

1. HijrahDate

Класс HijrahDate представляет даты в календарной системе Hijrah, широко известной как исламский или арабский календарь, которая представляет собой календарную систему, основанную на лунном календаре, состоящую из 12 лунных месяцев с 354 или 355 днями. Он используется для определения исламских праздников, таких как ежегодный период поста или событие Hijrah.
В исламском календаре используется эра 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