Last active
July 27, 2017 22:07
-
-
Save kodie/fba876e69f239fb2917d5ed5bea2c2e7 to your computer and use it in GitHub Desktop.
Convert hebrew dates
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/*! | |
Original code found here: http://www.dafaweek.com/HebCal/HebCalSampleSource.php | |
Simplifed by Kodie Grantham - http://kodieg.com | |
Hebrew Months: | |
1 - Tishrei | |
2 - Cheshvan | |
3 - Kislev | |
4 - Teves | |
5 - Shevat | |
6 - Adar A (only valid on leap years) | |
7 - Adar (Adar B for leap years) | |
8 - Nisan | |
9 - Iyar | |
10 - Sivan | |
11 - Tamuz | |
12 - Av | |
13 - Elul | |
*/ | |
function convertHebrewDate(year, month, date) { | |
if (year instanceof Date) { | |
date = year.getDate(); | |
month = year.getMonth(); | |
year = year.getFullYear(); | |
} else { | |
date = parseInt(date); | |
month = parseInt(month); | |
year = parseInt(year); | |
} | |
var ly = function(y) { | |
var n = y % 19; | |
return (n == 3 || n == 6 || n == 8 || n == 11 || n == 14 || n == 17 || n === 0); | |
}; | |
var ti = function(y) { | |
var h = y - 1; | |
var m = Math.floor(h / 19) * 235; | |
h = h % 19; | |
m += 12 * h; | |
if (h >= 17) { | |
m += 6; | |
} else if (h >= 14) { | |
m += 5; | |
} else if (h >= 11) { | |
m += 4; | |
} else if (h >= 8) { | |
m += 3; | |
} else if (h >= 6) { | |
m += 2; | |
} else if (h >= 3) { | |
m += 1; | |
} | |
var c = 793 * m + 204; | |
var o = Math.floor(c / 1080); | |
c = c % 1080; | |
o += m * 12 + 5; | |
var d = Math.floor(o / 24); | |
o = o % 24; | |
d += 29 * m + 2; | |
var w = d % 7; | |
if (!ly(y) && w == 3 && (o * 1080) + c >= (9 * 1080) + 204) { | |
w = 5; | |
d += 2; | |
} else if (ly(y - 1) && w == 2 && (o * 1080) + c >= (15 * 1080) + 589) { | |
w = 3; | |
d += 1; | |
} else { | |
if (o >= 18) { w += 1; w = w % 7; d += 1; } | |
if (w == 1 || w == 4 || w == 6) { w += 1; w = w % 7; d += 1; } | |
} | |
d -= 2067025; | |
var t = new Date(1900, 0, 1); | |
t.setDate(t.getDate() + d); | |
return t | |
}; | |
var lo = function(y) { | |
return Math.round((ti(y + 1) - ti(y)) / (1000 * 60 * 60 * 24)); | |
}; | |
this.toGreg = function() { | |
var e; | |
var l = ly(year); | |
var o = lo(year); | |
var h = (o == 353 || o == 383); | |
var s = (o == 355 || o == 385); | |
var d = ti(year); | |
for (var m = 1; m <= month - 1; m ++) { | |
if (m == 1 || m == 5 || m == 8 || m == 10 || m == 12) { | |
e = 30; | |
} else if (m == 4 || m == 7 || m == 9 || m == 11 || m == 13) { | |
e = 29; | |
} else if (m == 6) { | |
e = (l ? 30 : 0); | |
} else if (m == 2) { | |
e = (s ? 30 : 29); | |
} else if (m == 3) { | |
e = (h ? 29 : 30); | |
} | |
d.setDate(d.getDate() + e); | |
} | |
d.setDate(d.getDate() + date - 1); | |
return [d.getFullYear(), (d.getMonth() + 1), d.getDate()]; | |
}; | |
this.toHeb = function() { | |
var d, q, w; | |
var g = new Date(year, month - 1, date); | |
var b = new Date(1900, 0, 1); | |
var o = 29 + (12 / 24) + (793 / (1080 * 24)); | |
var a = o * (235 / 19); | |
var n = Math.round((g - b) / (24 * 60 * 60 * 1000)) + 2067025; | |
var y = Math.floor(n / a) + 1; | |
var t = ti(y); | |
if (t.getTime() === g.getTime()) { | |
m = 1; | |
d = 1; | |
} else { | |
if (t < g) { | |
while (ti(y + 1) <= g) { y += 1 } | |
} else { | |
y -= 1; | |
while (ti(y) > g) { y -= 1; } | |
} | |
n = Math.round(g - ti(y)) / (24 * 60 * 60 * 1000); | |
var e = lo(y); | |
var h = (e == 353 || e == 383); | |
var s = (e == 355 || e == 385); | |
var l = ly(y); | |
var m = 1; | |
do { | |
switch (m) { | |
case 1: case 5: case 6: case 8: case 10: case 12: | |
q = 30; | |
break; | |
case 4: case 7: case 9: case 11: case 13: | |
q = 29; | |
break; | |
case 6: | |
q = 30; | |
break; | |
case 2: | |
q = (s ? 30 : 29); | |
break; | |
case 3: | |
q = (h ? 29: 30); | |
break; | |
} | |
if (n >= q) { | |
w = true; | |
n -= q; | |
if (l || m != 5) { m++; } else { m += 2; } | |
} else { w = false; } | |
} while (w) { d = n + 1; } | |
} | |
return [y, m, d]; | |
}; | |
return this; | |
} | |
var h = convertHebrewDate(2017, 4, 20).toHeb(); | |
var g = convertHebrewDate(5777, 8, 24).toGreg(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment