22

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

Qix - MONICA WAS MISTREATED
  • 14,451
  • 16
  • 82
  • 145
FuNk
  • 223
  • 1
  • 2
  • 6

5 Answers5

25
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

Lixas
  • 6,938
  • 2
  • 25
  • 42
  • thank you for the fast reply, i will try and use this function.. =D – FuNk Mar 03 '11 at 07:21
  • Excellent, can you please tell me what this adjustment / adjust variable is used for?? – AtanuCSE Jun 19 '14 at 05:19
  • "Adjust" variable is used to correct the shift in Hijri dates which occurs because of variable moon status and visibility on different months. – Ahmed Said Apr 01 '15 at 13:41
  • Please see here to convert any Islamic calendar to Gregorian Date without using libraries or complex formulas: https://stackoverflow.com/questions/71222556/how-to-convert-any-of-the-5-islamic-hijri-calendars-dates-to-any-of-18-world – Mohsen Alyafei Mar 16 '22 at 14:10
6

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'))

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

Zakaria
  • 1,055
  • 12
  • 16
  • This formula will give an error of -11 days to +2 days (depending on the year) from the correct Hijri Date based on the Umalqura Calendar. – Mohsen Alyafei Feb 07 '22 at 11:29
  • 1
    @MohsenAlyafei : Thank you for your comment, you can review the final Update (2021-10-11), we add more precise equation with simple code in both JS & C#, as well as the Umalqura is just a selection date from fixed static array with limited predefined dates. – Zakaria Feb 09 '22 at 13:20
  • Thanks. What would be the approximate formula to convert from Hijri to Gregorian? – Mohsen Alyafei Feb 10 '22 at 02:46
  • Please see here to convert any Islamic calendar to Gregorian Date without using libraries or complex formulas: https://stackoverflow.com/questions/71222556/how-to-convert-any-of-the-5-islamic-hijri-calendars-dates-to-any-of-18-world – Mohsen Alyafei Mar 16 '22 at 14:09
6

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.

m.sarhan
  • 316
  • 3
  • 6
  • Please see here to convert any Islamic calendar to Gregorian Date without using libraries or complex formulas: https://stackoverflow.com/questions/71222556/how-to-convert-any-of-the-5-islamic-hijri-calendars-dates-to-any-of-18-world – Mohsen Alyafei Mar 16 '22 at 14:09
4

The safest is to use the built-in javascript Intl.DateTimeFormat() constructor.

Here is an example of the 4 output formats in the Islamic Hijri Calendar of today's date.

Also examples of extracting the year and months separately under different formats.

let myFormat = 'en-u-ca-islamic-umalqura-nu-latn'; // use islamic-umalqura calendar (most modern)
let myDate   = new Date(Date.now());  // today's date
let output   = new Intl.DateTimeFormat(myFormat,{dateStyle:'full'}).format(myDate);
console.log("Full format   : "+output);

output   = new Intl.DateTimeFormat(myFormat,{dateStyle:'long'}).format(myDate);
console.log("Long format   : "+output);

output   = new Intl.DateTimeFormat(myFormat,{dateStyle:'medium'}).format(myDate);
console.log("Medium format : "+output);

output   = new Intl.DateTimeFormat(myFormat,{dateStyle:'short'}).format(myDate);
console.log("Short format (m/d/yyyy): "+output);

console.log("=".repeat(50));

let yearFull = new Intl.DateTimeFormat(myFormat,{year:'numeric'}).format(myDate);
console.log("The full year     : "+yearFull);
console.log("The year number   : " +(+yearFull.split(" ")[0]));

let monthLong = new Intl.DateTimeFormat(myFormat,{month:'long'}).format(myDate);
let monthShort = new Intl.DateTimeFormat(myFormat,{month:'short'}).format(myDate);
let monthNum = new Intl.DateTimeFormat(myFormat,{month:'numeric'}).format(myDate);
let month2 = new Intl.DateTimeFormat(myFormat,{month:'2-digit'}).format(myDate);
console.log("The long month    : "+monthLong);
console.log("The short month   : "+monthShort);
console.log("The month number  : "+monthNum);
console.log("The month 2 digits: "+month2);
Mohsen Alyafei
  • 4,765
  • 3
  • 30
  • 42
0

In Javascript to convert the date, you could use Intl (read more) as following:

a = new Date();
localeFormat= 'ar-SA-islamic-umalqura';
Intl.DateTimeFormat(localeFormat).format(a)
kerbrose
  • 1,095
  • 2
  • 11
  • 22