2013-03-31 11 views
10

ich von Gregorian zu Hijri (islamisches) Datum konvertieren möchten, und ich brauche eine Java-Klasse für diese Umwandlung. Ich möchte ihm ein Gregorian Datum im Format von „yyyy/mm/dd“ als String geben, und es gibt mir das Hijri Datum im gleichen Format geben. Kann mir jemand helfen?gregorianischen zu hijri Datum Umwandlung

+1

Haben Sie etwas versucht zu konvertieren? Haben Sie sich mit einem besonderen Problem konfrontiert? – araknoid

+0

Ich habe einige Codes ausprobiert, die beim Suchen gefunden wurden, aber keiner von ihnen hat wahrscheinlich nicht funktioniert. – anony

Antwort

24

Zunächst trennt die Umwandlung Teil von der Formatierung aus/Parsing-Teil. Sie können später leicht mit denen beschäftigen - und es gibt viele von Fragen auf Stack Overflow darüber.

Persönlich würde ich Joda Time, verwenden Sie die in der Regel macht das Leben viel einfacher. Zum Beispiel: (. Es fühlt sich an wie es sollte eine sauberere Möglichkeit zur Umwandlung von Terminen zwischen Chronologien, aber ich konnte man nicht sofort finden)

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 Ich mag Ihren Weg besser, kurzer Code. Auf der einen, die ich gepostet habe, ist nur die Art und Weise, wie es funktioniert – knowbody

+2

+ Knowbody Ich weiß nicht warum, aber dieser Code bringt mir 1434-05-18 nicht 1434-05-19? Wie kann ich dieses Problem beheben? – anony

+0

@anony: Hier gibt es zwei verschiedene Möglichkeiten - eine erwartet die falsche Epoche (es gibt astronomische und zivile Epochen) und die andere ist, dass man eine islamische Chronologie mit einem anderen Schaltjahrmuster verwenden muss. Sehen Sie sich die Dokumente für IslamicChronology für Details an. –

4

nur verwenden Google for example here aus dem Link kopiert gegeben:

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

Ich glaube, ich würde lieber eine vorhandene Bibliothek verwenden, als all das Code in meinem eigenen Projekt enthalten müssen :) –

+1

Ich würde das gleiche tun, hier kann man sehen, wie es funktioniert;) – knowbody

+0

es nicht funktionieren right.it bringen Sie für einige Tage ähnliche Daten mit. für Beispiel Ich habe seine Eingabe geändert, um eine Zeichenfolge zu erhalten, und es wurde das gleiche Datum für "2014/1/29" und "2014/2/1" festgelegt. Ich bevorzuge jedoch eine Bibliothek als all diesen Code. Danke für Ihre Hilfe;) – anony

9

Java 8 ist genug jetzt mit Hejrah Datum

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

Schnipsel:

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

Aber nicht jedes islamische Land folgt dem offiziellen Kalender von Saudi-Arabien (die Variante, die in Java-8 unterstützt wird), also würde ich sagen, es ist NICHT genug. Selbst lokale Behörden in Saudi-Arabien haben ihre eigenen abweichenden Gewohnheiten. –

+1

Zuvor folgten alle islamischen Länder dem offiziellen Islamkalender (Hijrah). Die Kreuzfahrerbesetzung dieser Länder erfordert jedoch ihren Kalender als einen Schritt, um die Identität der Menschen zu ändern .... Leider haben sie ihr Ziel nicht erreicht, weil wir immer noch مسلمين .. Dank an Allah –

2

Versuchen ummalqura-calendar die java.util.Calendar implementiert.

Mit diesem Kalender können Sie von Umm Al-Qura nach Gregorian und umgekehrt konvertieren, und Sie können auch java.text.SimpleDateFormat verwenden, um Daten zu formatieren.

+0

danke für diese gut umgesetzt und dokumentiert Bibliothek –

0

Probe Art und Weise Datum auf Android-Plattform importieren

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; 

dann

implements HijriDatePickerDialog.OnDateSetListener 

auf onDateSet Methode

@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)); 
}