All about flooble | fun stuff | Get a free chatterbox | Free JavaScript | Avatars
 perplexus dot info

 Chinese New Year (Posted on 2015-01-16)

Chinese New Year (CNY) falls on 19th February this year. That's an unusually late date; CNY generally falls around the beginning of February.

CNY can also fall on 20th February, though that's only happened once in my lifetime.

a. When will CNY next fall on 20th February?
b. Can CNY ever fall on 21st February? If so, when will that happen next?

 See The Solution Submitted by broll No Rating

Comments: ( Back to comment list | You must be logged in to post comments.)
 re: computer solution -- the JavaScript code | Comment 3 of 8 |
(In reply to computer solution by Charlie)

`The calculations:  // Series on new window  function chSeries(form) {    var year0 = form.year.value;    var numb = form.numYears.value;    newWindow = window.open('','newWin','scrollbars=yes,resizable=yes,location=yes,width=300,height=300')    newWindow.document.writeln('<html><head><title>Chinese New Years<\/title><\/head><body>');    newWindow.document.write("<table>")    for (year=year0; year<1*year0+1*numb && year<4100;year++) {    if (year >= 1644 && year <= 4099) {      result = chNYCalc(year);  if (result.month == 2 && (result.day > 19))     {      if (result.month == 1)            month = "January";      else            month = "February";      newWindow.document.write("<tr><td>"+month+"<\/td>")      newWindow.document.write("<td>"+result.day+"<\/td>")      newWindow.document.write("<td>"+year+"<\/td>")      newWindow.document.write("<td>"+result.animal+"<\/td>")      newWindow.document.writeln("<\/tr>")     }    } /* if */    } /* for */    newWindow.document.writeln("<\/table><\/body><\/html>")    newWindow.document.close()  }  function clrTxt(form){     form.day.value = "";     form.month.value = "";     form.animal.value = "";     form.animalPrev.value = "";  }  // Truncate an integer.  function trunc(num) {    if (num > 0)      return Math.floor(num);    else      return Math.ceil(num);  }  // Normalize a degree measure  function fnnm(x) {   return (x - 360 * Math.floor(x/360));  }  // trig functions in degrees   function fnsn(x) {     return Math.sin(x*dr)}   function fncs(x) {     return Math.cos(x*dr)}  // Chinese New Year CALCULATION  function chNYCalc(y) {    /*     * y is a 4 digit year     * d returns the day of the month of Chinese New Year     * m returns the month of Chinese New Year     *     */   var chTZ;            // Chinese Time Zone -- hours   var s1, s2;            // preceding and contained winter solstice jd   var solT1, solT2;   // solar terms 1 and 2 - begin and end Aquarius   var m1, m2, m3, m12;     // new moons   var NY; // Proposed JD of new year   var m,d,y;   var cw0, cw1, cw2, cw3;   var c;     // animal number    a = new Array (     "Rat",  "Ox", "Tiger", "Rabbit(Hare)",   "Dragon", "Snake", "Horse", "Sheep(Goat)",   "Monkey", "Rooster", "Dog", "Boar(Pig)")   var animal,animalPrev;    if (y < 1928)      chTZ = -(465+40/60)/60;    else      chTZ = -8;    s1 = wSolst(y-1,chTZ);    s2 = wSolst(1*y,chTZ);    solT1 = solTerm(y, chTZ, 300);    solT2 = solTerm(y, chTZ, 330);    m1 = nextNewMoon(s1, chTZ);    m2 = nextNewMoon(m1, chTZ);    m3 = nextNewMoon(m2, chTZ);    m12 = nextNewMoon(s2, chTZ);    NY = m2    if (Math.floor((m12 - m1)/ 29.530588 + .5) == 13)      if (solT1 >= m2 || solT2 >= m3) {         NY = m3;     /*  alert("delay")  */         }    if (NY > 2299160)      {cw0= Math.floor((NY - 1867216.25)/36524.25);       cw0= NY + 1 + cw0 - Math.floor(cw0/4);      } else      {cw0= NY};    cw0 += 1524;    cw1 = Math.floor((cw0 - 122.1)/365.25);    cw2 = Math.floor(365.25*cw1);    cw3 = Math.floor((cw0 - cw2)/30.6001);    d = cw0 - cw2 - Math.floor(30.61*cw3);    y = cw1 - 4716;    m = cw3 - 1;    if (m > 12)      {m -= 12; y += 1;}    c = (y-4) % 12; cPrev= (y-5) % 12;    animal = a[c]; animalPrev = a[cPrev];    return {month: m, day: d, animal: animal,      animalPrev: animalPrev}; // object containing the results  }function nextNewMoon (j1, chTZ) {  var d,j1,t,k,m,mp,F,jdNo    d = j1 - 2415020; t = d / 36525    k = (j1 - 2415020.759) / 29.53058868; k = Math.floor(k) - 1    jdNo = 0    while (jdNo <= j1){     m = fnnm(359.22 + 29.10535608 * k)     mp = fnnm(306.03 + 385.8169181 * k + .01073 * t * t + .00001236 * t * t * t)     F = fnnm(21.2964 + 390.67050646 * k - .0016528 * t * t)     jdNo = 2415020.75933 + 29.53058868 * k + .0001178 * t * t     jdNo = jdNo + .1734 * fnsn(m)     jdNo = jdNo + .0021 * fnsn(2 * m)     jdNo = jdNo - .4068 * fnsn(mp)     jdNo = jdNo + .0161 * fnsn(2 * mp)     jdNo = jdNo + .0104 * fnsn(2 * F)     jdNo = jdNo - .0051 * fnsn(m + mp)     jdNo = jdNo - .0074 * fnsn(m - mp)     jdNo = jdNo + .001 * fnsn(2 * F - mp)     jdNo = jdNo - (.41 + 1.2053 * t + .4992 * t * t) / 1440     jdNo = jdNo - chTZ / 24     jdNo = Math.floor(jdNo + .5)     k = k + 1    } // LOOP UNTIL jdNo > j1    return jdNo}function solTerm (y, chTZ, LO) {   var ys,t,PE,L,DT,m,chJD;    if (LO >= 270)       ys = y - 1;     else       ys = 1*y;    t = (365.2422 * (ys + LO / 360) - 693878.7) / 36525    PE = .00134 * fncs(22518.7541 * t + 153)    PE = PE + .00154 * fncs(45037.5082 * t + 217) + .002 * fncs(32964.3577 * t + 313) + .00178 * fnsn(20.2 * t + 231)    DT = 1    while (Math.abs(DT * 36525) > .001) {      L = 279.6967 + 36000.76892 * t + .0003025 * t * t      m = 358.476 + 35999.04975 * t - .00015 * t * t - .0000033 * t * t * t      L = L + (1.91946 - .004789 * t - .000014 * t * t) * fnsn(m) + (.020094 - .0001 * t) * fnsn(2 * m) + .000293 * fnsn(3 * m)      L = L - .00479 * fnsn(fnnm(259.18 - 1934.142 * t)) - .00569 + PE + .00179 * fnsn(351 + 445267.1142 * t - .00144 * t * t)      L = fnnm(L)      DT = (fnnm(LO - L + 180) - 180) / 36525      t = t + DT;    } // LOOP WHILE ABS(DT * 36525) > .001    chJD = t * 36525 + 2415020 - (.41 + 1.2053 * t + .4992 * t * t) / 1440 - chTZ / 24    return Math.floor(chJD + .5)}function wSolst (ys, chTZ)  { //chTZ in hours; + = west    var LO,t,PE,L,DT,chJD    LO = 270    t = (365.2422 * (1*ys + LO / 360) - 693878.7) / 36525    PE = .00134 * fncs(22518.7541 * t + 153)    PE = PE + .00154 * fncs(45037.5082 * t + 217) + .002 * fncs(32964.3577 * t + 313) + .00178 * fnsn(20.2 * t + 231)    DT = 1    while (Math.abs(DT * 36525) > .001) {      L = 279.6967 + 36000.76892 * t + .0003025 * t * t      m = 358.476 + 35999.04975 * t - .00015 * t * t - .0000033 * t * t * t      L = L + (1.91946 - .004789 * t - .000014 * t * t) * fnsn(m) + (.020094 - .0001 * t) * fnsn(2 * m) + .000293 * fnsn(3 * m)      L = L - .00479 * fnsn(fnnm(259.18 - 1934.142 * t)) - .00569 + PE + .00179 * fnsn(351 + 445267.1142 * t - .00144 * t * t)      L = fnnm(L)      DT = (fnnm(LO - L + 180) - 180) / 36525      t = t + DT;    } // LOOP WHILE ABS(DT * 36525) > .001    chJD = t * 36525 + 2415020 - (.41 + 1.2053 * t + .4992 * t * t) / 1440 - chTZ / 24    return Math.floor(chJD + .5)}`

The term - (.41 + 1.2053 * t + .4992 * t * t) / 1440 is the adjustment for the slowing rotation rate of the earth.

 Posted by Charlie on 2015-01-16 20:38:08

 Search: Search body:
Forums (0)