UNPKG

vue-lunar-calendar

Version:

A vue component for lunar calendar. Uses Moment.js for date operations.

144 lines (134 loc) 6.42 kB
// 1881-2050 let Transformer = { proivateData: { MonthTable: [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31], LunarTable: ["1212122322121", "1212121221220", "1121121222120", "2112132122122", "2112112121220", "2121211212120", "2212321121212", "2122121121210", "2122121212120", "1232122121212", // 1890 "1212121221220", "1121123221222", "1121121212220", "1212112121220", "2121231212121", "2221211212120", "1221212121210", "2123221212121", "2121212212120", "1211212232212", // 1900 "1211212122210", "2121121212220", "1212132112212", "2212112112210", "2212211212120", "1221412121212", "1212122121210", "2112212122120", "1231212122212", "1211212122210", // 1910 "2121123122122", "2121121122120", "2212112112120", "2212231212112", "2122121212120", "1212122121210", "2132122122121", "2112121222120", "1211212322122", "1211211221220", // 1920 "2121121121220", "2122132112122", "1221212121120", "2121221212110", "2122321221212", "1121212212210", "2112121221220", "1231211221222", "1211211212220", "1221123121221", // 1930 "2221121121210", "2221212112120", "1221241212112", "1212212212120", "1121212212210", "2114121212221", "2112112122210", "2211211412212", "2211211212120", "2212121121210", // 1940 "2212214112121", "2122122121120", "1212122122120", "1121412122122", "1121121222120", "2112112122120", "2231211212122", "2121211212120", "2212121321212", "2122121121210", // 1950 "2122121212120", "1212142121212", "1211221221220", "1121121221220", "2114112121222", "1212112121220", "2121211232122", "1221211212120", "1221212121210", "2121223212121", // 1960 "2121212212120", "1211212212210", "2121321212221", "2121121212220", "1212112112220", "1223211211221", "2212211212120", "1221212321212", "1212122121210", "2112212122120", // 1970 "1211232122212", "1211212122210", "2121121122210", "2212312112212", "2212112112120", "2212121232112", "2122121212110", "2212122121210", "2112124122121", "2112121221220", // 1980 "1211211221220", "2121321122122", "2121121121220", "2122112112322", "1221212112120", "1221221212110", "2122123221212", "1121212212210", "2112121221220", "1211231221222", // 1990 "1211211212220", "1221121121220", "1223212112121", "2221212112120", "1221221232112", "1212212122120", "1121212212210", "2112132212221", "2112112122210", "2211211212210", // 2000 "2221321121212", "2212121121210", "2212212112120", "1232212121212", "1212122122110", "2121212322122", "1121121222120", "2112112122120", "2211231212122", "2121211212120", // 2010 "2122121121210", "2124212112121", "2122121212120", "1212121223212", "1211212221210", "2121121221220", "1212132121222", "1212112121220", "2121211212120", "2122321121212", // 2020 "1221212121210", "2121221212120", "1232121221212", "1211212212210", "2121123212221", "2121121212220", "1212112112220", "1221231211221", "2212211211220", "1212212121210", // 2030 "2123212212121", "2112122122120", "1211212122232", "1211212122210", "2121121122120", "2212114112212", "2212112112120", "2212121211210", "2212232121211", "2122122121210", // 2040 "2112122122120", "1231212122122", "1211211221220", "2121121321222", "2121121121220", "2122112112120", "2122141211212", "1221221212110", "2121221221210", "2114121221221" // 2050 ], lunarDate: { year: 1, month: 0, day: 1, isYunMonth: false }, temp: 1 }, methods: { solar2lunar(d) { let yun = this.SolarToLunar(d) return { 'day': yun.year + "-" + (yun.month + 1) + "-" + yun.day, 'dayTxt': (yun.month + 1) + "." + yun.day, 'isYunMonth': yun.isYunMonth } }, totalDays(solar_date) { let transData = this.$options.proivateData if (((solar_date.getFullYear() % 4 == 0) && (solar_date.getFullYear() % 100 != 0)) || (solar_date.getFullYear() % 400 == 0)){ transData.MonthTable[1] = 29 } else{ transData.MonthTable[1] = 28 } let sum = 0; for (let i=0; i<solar_date.getMonth(); i++) { sum = sum + transData.MonthTable[i] } let nYears366 = parseInt((solar_date.getFullYear() - 1) / 4) - parseInt((solar_date.getFullYear() - 1) / 100) + parseInt((solar_date.getFullYear() - 1) / 400) let tdays = (solar_date.getFullYear() - 1) * 365 + sum + nYears366 + solar_date.getDate() - 1 return tdays }, nDaysYear(year) { let transData = this.$options.proivateData let sum = 0; for (let i=0; i<13; i++) { if (parseInt(transData.LunarTable[year-1881].charAt(i))) { sum += (29 + (parseInt(transData.LunarTable[year - 1881].charAt(i)) + 1) % 2) } } return sum }, nDaysMonth(lunar_date) { let transData = this.$options.proivateData let yun = 0 if (!((lunar_date.month) <= this.YunMonth(lunar_date.year) && !lunar_date.isYunMonth)){ yun = 1 } let nDays = 29 + ((parseInt(transData.LunarTable[lunar_date.year - 1881].charAt((lunar_date.month) + yun)) + 1) % 2) return nDays }, YunMonth(year) { let transData = this.$options.proivateData let yun = 0; do { if (transData.LunarTable[year-1881].charAt(yun) > 2) { break } yun++; } while (yun <= 12) return (yun - 1) }, SolarToLunar(solar_date) { let transData = this.$options.proivateData let nDays = this.totalDays(solar_date) - 686685 let tmp = 0 transData.lunarDate.year = 1881 transData.lunarDate.month = 0 transData.lunarDate.day = 1 transData.lunarDate.isYunMonth = false do { tmp = nDays nDays -= this.nDaysYear(transData.lunarDate.year) if (nDays < 0) { nDays = tmp break } transData.lunarDate.year++ } while (true) do { tmp = nDays nDays -= this.nDaysMonth(transData.lunarDate) if (nDays < 0) { nDays = tmp break } if ((transData.lunarDate.month) == this.YunMonth(transData.lunarDate.year) && !transData.lunarDate.isYunMonth) { transData.lunarDate.isYunMonth = true } else { transData.lunarDate.month++ transData.lunarDate.isYunMonth = false } } while (true) transData.lunarDate.day = nDays + 1 return transData.lunarDate } } } export default Transformer