Преобразование григорианской даты в хиджры

Я хочу конвертировать из григорианской даты в хиджры (исламская) и мне нужен java-класс для этой конвертации. Я хочу дать ему григорианскую дату в формате "гггг / мм / дд" в виде строки, и это даст мне дату хиджры в том же формате. Может кто-нибудь мне помочь?

7 ответов

Решение

Во-первых, отделите часть преобразования от части форматирования / анализа. Вы можете легко справиться с этим позже - и на Stack Overflow есть множество вопросов по этому поводу.

Лично я бы использовал Joda Time, которая обычно делает жизнь намного проще. Например:

import org.joda.time.Chronology;
import org.joda.time.LocalDate;
import org.joda.time.chrono.IslamicChronology;
import org.joda.time.chrono.ISOChronology;

public class Test {
    public static void main(String[] args) throws Exception {
        Chronology iso = ISOChronology.getInstanceUTC();
        Chronology hijri = IslamicChronology.getInstanceUTC();

        LocalDate todayIso = new LocalDate(2013, 3, 31, iso);
        LocalDate todayHijri = new LocalDate(todayIso.toDateTimeAtStartOfDay(),
                                             hijri);
        System.out.println(todayHijri); // 1434-05-19
    }
} 

(Такое ощущение, что должен быть более чистый способ преобразования дат между хронологиями, но я не смог сразу его найти.)

Java 8 теперь достаточно с Hejrah Date

Фрагмент:

import java.time.*;
import java.time.chrono.HijrahChronology;

Date date = new Date(); // Gregorian date

Calendar cl=Calendar.getInstance();
cl.setTime(date);

HijrahDate islamyDate = HijrahChronology.INSTANCE.date(LocalDate.of(cl.get(Calendar.YEAR),cl.get(Calendar.MONTH)+1, cl.get(Calendar.DATE))); 
//OUTPUT: Hijrah-umalqura AH 1436-02-03 

Просто используйте Google, например, здесь скопирован по данной ссылке:

import java.util.Calendar;  
/** 
 * Gregorian-Hijri Dates Converter 
 *  
 *  
 * This Code is used to convert Gregorian dates to Hijri Dates  
 *  
 * 
 */  

public class DateHigri {  


static double gmod(double n,double  m) {  
    return ((n % m) + m) % m;  
}  

static double[] kuwaiticalendar(boolean adjust) {  
    Calendar today = Calendar.getInstance();  
    int adj=0;  
    if(adjust){  
        adj=0;  
    }else{  
        adj=1;  
    }  

    if (adjust) {  
        int adjustmili = 1000 * 60 * 60 * 24 * adj;  
        long todaymili = today.getTimeInMillis() + adjustmili;  
        today.setTimeInMillis(todaymili);  
    }  
    double day = today.get(Calendar.DAY_OF_MONTH);  
    double  month = today.get(Calendar.MONTH);  
    double  year = today.get(Calendar.YEAR);  

    double  m = month + 1;  
    double  y = year;  
    if (m < 3) {  
        y -= 1;  
        m += 12;  
    }  

    double a = Math.floor(y / 100.);  
    double b = 2 - a + Math.floor(a / 4.);  

    if (y < 1583)  
        b = 0;  
    if (y == 1582) {  
        if (m > 10)  
            b = -10;  
        if (m == 10) {  
            b = 0;  
            if (day > 4)  
                b = -10;  
        }  
    }  

    double jd = Math.floor(365.25 * (y + 4716)) + Math.floor(30.6001 * (m + 1)) + day  
            + b - 1524;  

    b = 0;  
    if (jd > 2299160) {  
        a = Math.floor((jd - 1867216.25) / 36524.25);  
        b = 1 + a - Math.floor(a / 4.);  
    }  
    double bb = jd + b + 1524;  
    double cc = Math.floor((bb - 122.1) / 365.25);  
    double dd = Math.floor(365.25 * cc);  
    double ee = Math.floor((bb - dd) / 30.6001);  
    day = (bb - dd) - Math.floor(30.6001 * ee);  
    month = ee - 1;  
    if (ee > 13) {  
        cc += 1;  
        month = ee - 13;  
    }  
    year = cc - 4716;  

    double wd = gmod(jd + 1, 7) + 1;  

    double iyear = 10631. / 30.;  
    double epochastro = 1948084;  
    double epochcivil = 1948085;  

    double shift1 = 8.01 / 60.;  

    double z = jd - epochastro;  
    double cyc = Math.floor(z / 10631.);  
    z = z - 10631 * cyc;  
    double j = Math.floor((z - shift1) / iyear);  
    double iy = 30 * cyc + j;  
    z = z - Math.floor(j * iyear + shift1);  
    double im = Math.floor((z + 28.5001) / 29.5);  
    if (im == 13)  
        im = 12;  
    double id = z - Math.floor(29.5001 * im - 29);  

    double[]  myRes = new double[8];  

    myRes[0] = day; // calculated day (CE)  
    myRes[1] = month - 1; // calculated month (CE)  
    myRes[2] = year; // calculated year (CE)  
    myRes[3] = jd - 1; // julian day number  
    myRes[4] = wd - 1; // weekday number  
    myRes[5] = id; // islamic date  
    myRes[6] = im - 1; // islamic month  
    myRes[7] = iy; // islamic year  

    return myRes;  
}  
static String writeIslamicDate() {  
    String[] wdNames = {"Ahad", "Ithnin", "Thulatha", "Arbaa", "Khams",  
            "Jumuah", "Sabt"};  
    String[] iMonthNames = {"Muharram", "Safar", "Rabi'ul Awwal",  
            "Rabi'ul Akhir", "Jumadal Ula", "Jumadal Akhira", "Rajab",  
            "Sha'ban", "Ramadan", "Shawwal", "Dhul Qa'ada", "Dhul Hijja"};  
    // This Value is used to give the correct day +- 1 day  
    boolean dayTest=true;  
    double[] iDate = kuwaiticalendar(dayTest);  
    String outputIslamicDate = wdNames[(int) iDate[4]] + ", " + iDate[5] + " "  
            + iMonthNames[(int) iDate[6]] + " " + iDate[7] + " AH";  

    return outputIslamicDate;  
}  
}  

Попробуйте ummalqura-календарь, который реализует java.util.Calendar,

С помощью этого календаря вы можете конвертировать из Умм Аль-Кура в григорианский и наоборот, а также вы можете использовать java.text.SimpleDateFormat форматировать даты.

Предполагая дату хиджры в формате гггг/мм/дд и дату по григорианскому календарю в формате гггг-мм-дд ,
вы можете адаптировать этот код для преобразования одного числа в другое.

      import java.time.*;
import java.time.chrono.*;
import java.time.format.DateTimeFormatter;

public class DateUtils {
    
    private DateUtils() {
        
    }
    
    public static String hijriToGreogorian(String hijriDateStr) {
        
        final String[] hijriDateArr = hijriDateStr.split("/");
        
        final HijrahDate hijrahDate = HijrahChronology.INSTANCE.date(HijrahEra.AH,
                Integer.parseInt(hijriDateArr[0]), Integer.parseInt(hijriDateArr[1]), Integer.parseInt(hijriDateArr[2]));

        return IsoChronology.INSTANCE.date(hijrahDate).toString();
    }
    
    public static String greogorianToHijri(String greoDateStr) {
        
        final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");

        return HijrahChronology.INSTANCE.date(LocalDate.parse(greoDateStr, formatter))
                .format(DateTimeFormatter.ofPattern("yyyy/MM/dd"));
    }

    public static void main(String[] args) {
        System.out.println(greogorianToHijri("2023-09-15")); // 1445/02/30
        System.out.println(hijriToGreogorian("1445/02/30")); // 2023-09-15
    }
}

Пример способа конвертации даты на импорт платформы Android

import org.joda.time.Chronology;
import org.joda.time.DateTime;
import org.joda.time.chrono.ISOChronology;
import org.joda.time.chrono.IslamicChronology;
import org.joda.time.LocalDate;

затем

implements  HijriDatePickerDialog.OnDateSetListener

по методу onDateSet

@Override
public void onDateSet(HijriDatePickerDialog view, int year, int monthOfYear, int dayOfMonth) {




    Chronology iso = ISOChronology.getInstanceUTC();
    Chronology hijri = IslamicChronology.getInstanceUTC();

    DateTime dtHijri = new DateTime(year,monthOfYear,monthOfYear,dayOfMonth,dayOfMonth,hijri);

    DateTime dtIso = new DateTime(dtHijri, iso);


    Log.i("converted date" ,String.valueOf(dtIso));
}

Для Android API 26 и выше вы можете использовать

      import java.time.chrono.HijrahDate

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        HijrahDate.now()
    }

Это встроенный класс в Java.

Другие вопросы по тегам