Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Converting Gregorian date to Hijri date

How do you convert Gregorian dates to Islamic Hijri dates using JavaScript?

like image 961
FuNk Avatar asked Mar 03 '11 06:03

FuNk


3 Answers

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

function kuwaiticalendar(adjust){
var today = new Date();
if(adjust) {
    adjustmili = 1000*60*60*24*adjust; 
    todaymili = today.getTime()+adjustmili;
    today = new Date(todaymili);
}
day = today.getDate();
month = today.getMonth();
year = today.getFullYear();
m = month+1;
y = year;
if(m<3) {
    y -= 1;
    m += 12;
}

a = Math.floor(y/100.);
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;
    }
}

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.);
}
bb = jd+b+1524;
cc = Math.floor((bb-122.1)/365.25);
dd = Math.floor(365.25*cc);
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;


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

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

shift1 = 8.01/60.;

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

var myRes = new Array(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;
}
function writeIslamicDate(adjustment) {
var wdNames = new Array("Ahad","Ithnin","Thulatha","Arbaa","Khams","Jumuah","Sabt");
var iMonthNames = new Array("Muharram","Safar","Rabi'ul Awwal","Rabi'ul Akhir",
"Jumadal Ula","Jumadal Akhira","Rajab","Sha'ban",
"Ramadan","Shawwal","Dhul Qa'ada","Dhul Hijja");
var iDate = kuwaiticalendar(adjustment);
var outputIslamicDate = wdNames[iDate[4]] + ", " 
+ iDate[5] + " " + iMonthNames[iDate[6]] + " " + iDate[7] + " AH";
return outputIslamicDate;
}

This converts current computer date to hijri. And with a little modification you can achieve that this snippet change any date to islamic

document.write(writeIslamicDate(1));

Taken from This site

like image 187
Lixas Avatar answered Sep 21 '22 14:09

Lixas


If you need only the year of Hijri date converted from Gregorian date (Miladi date) you can simply write this equation in javascript:

var GregorianYear = (new Date()).getFullYear();
var HijriYear = Math.round((GregorianYear - 622) * (33 / 32));

you can use this simple equation in the footer in master page like كل الحقوق محفوطة لـ ... ©

<script type="text/javascript">document.write((new Date()).getFullYear())</script> م - <script type="text/javascript">var y = (new Date()).getFullYear();var h = Math.round((y - 622) * (33 / 32));document.write(h)</script> هـ

you will get: كل الحقوق محفوطة لـ ... © 2014 م - 1435 هـ

you can also use C# embedded in asp page as:

<%= DateTime.Now.Year %> - <%=  Math.Round((DateTime.Now.Year - 622) * 1.03125) %>

will return : 2014 - 1436

Finally, if you need to convert to UmAlQura date, simply try this line of code:

let _date = new Date('7/10/2019').toLocaleDateString('ar-SA').format('DD/MM/YYYY');

console.log(_date);

will return : ٧‏/١١‏/١٤٤٠ هـ

Update (2021-10-11) : If you need a more precise equation you have to know the current day of solar year by this formula :

var now = new Date();
var start = new Date(now.getFullYear(), 0, 0);
var diff = now - start;
var oneDay = 1000 * 60 * 60 * 24;
var dayOfYear = Math.floor(diff / oneDay);

Then you can get the Hijri year by this formula:

HijriYear = ((GregorianYear-621.5643)*365.24225 + dayOfYear) / 354.36707

Where :

365.24225 is the number of days in solar year.

354.36707 is the number of days in lunar year.

621.5643 is the exact Gregorian date of Hijra (start date of Hijri date)

HijriYear = ((2021-621.5643)*365.24225 + 284) / 354.36707 = 1,443.18444

So the current Hijri year is 1443 by using Math.floor(HijriYear) function.

Also you can use the fraction :

var hijriDayOfYear  = (HijriYear - Math.floor(HijriYear)) * 354.36707

0.18444 multiplied by 354.36707 to get the number of days in Hijri calendar :

0.18444 * 354.36707 = 65.3 : the number of day in this current Hijri year

Math.ceil(hijriDayOfYear / 29.530589) = 3 number of current Hijri month

Math.floor(hijriDayOfYear % 29.530589) = 6 ± 1 number of day in this Hijri month

Finally to summarize all of previous just use the following JS code:

var now = new Date()
var dayOfYear = Math.floor((new Date() - new Date(now.getFullYear(), 0, 0)) / (1000 * 60 * 60 * 24))
var hijriDate = ((now.getFullYear()-621.5643)*365.24225 + dayOfYear) / 354.36707
var hijriYear = Math.floor(hijriDate)
var hijriMonth = Math.ceil((hijriDate - Math.floor(hijriDate)) * 354.36707 / 29.530589)
var hijriDay = Math.floor((hijriDate - Math.floor(hijriDate)) * 354.36707 % 29.530589)
    
console.log(`${hijriYear}/${hijriMonth}/${hijriDay}`)

console output sample : 1443/3/6

General JavaScript Function to convert datetime to Hijri date:

function GetHijriDate(dateTime) {    
    var dayOfYear = Math.floor((dateTime - new Date(dateTime.getFullYear(), 0, 0)) / (1000 * 60 * 60 * 24))
    var hijriDate = ((dateTime.getFullYear() - 621.5643) * 365.24225 + dayOfYear) / 354.36707
    var hijriYear = Math.floor(hijriDate)
    var hijriMonth = Math.ceil((hijriDate - Math.floor(hijriDate)) * 354.36707 / 29.530589)
    var hijriDay = Math.floor((hijriDate - Math.floor(hijriDate)) * 354.36707 % 29.530589)
    return [hijriYear, hijriMonth , hijriDay]
}

In C# :

    /// <summary>
    /// Gets the hijri date.
    /// </summary>
    /// <param name="date">The date.</param>
    /// <returns></returns>
    public static int[] GetHijriDate(DateTime date)
    {
        var yearOfHijra = 621.5643f;
        var daysInSolarYear = 365.24225f;
        var daysInLunarYear = 354.36707f;
        var daysInLunarMonth = 29.53058f;

        var hijriDate = ((date.Year - yearOfHijra) * daysInSolarYear  + date.DayOfYear) / daysInLunarYear;
        var hijriYear = (int)Math.Floor(hijriDate);
        var hijriMonth = (int)Math.Ceiling((hijriDate - Math.Floor(hijriDate)) * daysInLunarYear / daysInLunarMonth);
        var hijriDay = (int)Math.Floor((hijriDate - Math.Floor(hijriDate)) * daysInLunarYear % daysInLunarMonth);

        int[] hijriDateRes = new int[3];
        hijriDateRes[0] = hijriYear;
        hijriDateRes[1] = hijriMonth;
        hijriDateRes[2] = hijriDay;

        return hijriDateRes;
    }

Or Simply :

console.log(new Date().toLocaleDateString('ar-SA'))

'٥‏/٣‏/١٤٤٣ هـ'

like image 41
Zakaria Avatar answered Sep 25 '22 14:09

Zakaria


Checkout my library hijrah-date which is a Javascript date in the Hijrah calendar system.

It also supports Hijrah to Gregorian and Gregorian to Hijrah conversion. In addition to date formatting.

like image 39
m.sarhan Avatar answered Sep 24 '22 14:09

m.sarhan