kodie
7/27/2017 - 9:35 PM

Convert hebrew dates

Convert hebrew dates

/*!
  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();