2013-03-31 3 views
10

Я хочу конвертировать из грегорианской в ​​хиджри (исламскую) дату, и мне нужен класс java для этого преобразования. Я хочу дать ему григорианскую дату в формате «yyyy/mm/dd» в качестве строки и дать мне дату хиджра в том же формате. Может кто-нибудь мне помочь?преобразование gregorian в hijri date

+1

вы пробовали что-нибудь? Вы столкнулись с какой-то особой проблемой? – araknoid

+0

Я пробовал некоторые коды, найденные путем поиска, но не из них, вероятно, не работали. – anony

ответ

24

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

Лично я бы использовал 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 
    } 
} 

+0

+1 Мне нравится ваш путь лучше, короткий код. На том, что я написал, это просто способ, которым это работает – knowbody

+2

+ knowbody Я не знаю, почему, но этот код приносит мне 1434-05-18 не 1434-05-19? как я могу исправить эту проблему? – anony

+0

@anony: Здесь есть две разные возможности: одна заключается в том, что вы ожидаете неправильную эпоху (есть астрономические и гражданские эпохи), а другая - вам нужно использовать исламскую хронологию с другим шаблоном високосного года. Посмотрите на документы для IslamicChronology для деталей. –

4

просто использовать Google for example here скопирована из ссылки Дано:

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; 
} 
} 
+4

Я бы предпочел использовать существующую библиотеку, чем включать весь этот код в свой собственный проект :) –

+1

Я бы сделал то же самое, здесь вы можете увидеть, как это работает;) – knowbody

+0

это не работает right.it приведите аналогичные даты в течение нескольких дней. напр. Я изменил его вход, чтобы получить строку, и сделал такую ​​же дату для «2014/1/29» и «2014/2/1». однако я предпочитаю использовать библиотеку, нежели весь этот код. спасибо за вашу помощь;) – anony

9

Java-достаточно теперь с Hejrah Датой

(Related to Prophet Hejrah: على صاحبها أفضل الصلاة و أزكى التسليم إلى يوم الدين):

Сниппет:

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


    Date date=new 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 
+1

Но не каждая исламская страна следует официальному календарю Саудовской Аравии (вариант, поддерживаемый на Java-8), поэтому я бы сказал, что этого недостаточно. Даже местные власти внутри Саудовской Аравии имеют свои собственные отклоняющиеся обычаи. –

+1

Раньше все исламские страны следовали официальному расписанию ислама (Хиджра). Однако оккупация этих стран крестоносцами требует своего Календаря как шаг к изменению личности людей ... К сожалению, они не достигли своей цели, потому что мы все еще مسلمين .. Спасибо за Аллаха –

2

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

Используя этот календарь, вы можете конвертировать из Umm Al-Qura в григорианский и наоборот, , а также можете использовать java.text.SimpleDateFormat для форматирования дат.

+0

спасибо за эту хорошо реализованную и задокументированную библиотеку –

0

образец способ преобразования даты на андроид импорта платформы

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)); 
} 
Смежные вопросы