betacode

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

Следуйте за нами на нашей фан-странице, чтобы получать уведомления каждый раз, когда появляются новые статьи. Facebook

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 для получения более подробной информации).
  • TODO Link?
Для удобства понимания давайте проанализируем приведенный ниже пример (используя вариант исламского календаря по умолчанию):
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
Maybe you are interested

Это онлайн курс вне вебсайта o7planning, который мы представляем, он включает бесплатные курсы или курсы со скидкой.