传入new Date()或者形如"Fri Mar 08 2019"的字符串 ,返回农历:几月[初/十/廿/卅]几

/**

* 传入一个日期或者字符串返回该日期的农历形式

* @param new Date() or "Fri Mar 08 2019"

* @return 几月[初/十/廿/卅]几

*/

const GetcDateString = TheDate => {

TheDate = new Date(TheDate);

let CalendarData = new Array(20);

let madd = new Array(12);

let numString = "一二三四五六七八九十";

let monString = "正二三四五六七八九十冬腊";

let cYear;

let cMonth;

let cDay;

let cHour;

function init() {

CalendarData[0] = 0x41A95;

CalendarData[1] = 0xD4A;

CalendarData[2] = 0xDA5;

CalendarData[3] = 0x20B55;

CalendarData[4] = 0x56A;

CalendarData[5] = 0x7155B;

CalendarData[6] = 0x25D;

CalendarData[7] = 0x92D;

CalendarData[8] = 0x5192B;

CalendarData[9] = 0xA95;

CalendarData[10] = 0xB4A;

CalendarData[11] = 0x416AA;

CalendarData[12] = 0xAD5;

CalendarData[13] = 0x90AB5;

CalendarData[14] = 0x4BA;

CalendarData[15] = 0xA5B;

CalendarData[16] = 0x60A57;

CalendarData[17] = 0x52B;

CalendarData[18] = 0xA93;

CalendarData[19] = 0x40E95;

madd[0] = 0;

madd[1] = 31;

madd[2] = 59;

madd[3] = 90;

madd[4] = 120;

madd[5] = 151;

madd[6] = 181;

madd[7] = 212;

madd[8] = 243;

madd[9] = 273;

madd[10] = 304;

madd[11] = 334;

}

function GetBit(m, n) {

return (m >> n) & 1;

}

function e2c(TheDate) {

let total, m, n, k;

let isEnd = false;

let tmp = TheDate.getYear();

if (tmp < 1900) tmp += 1900;

total = (tmp - 2001) * 365

+ Math.floor((tmp - 2001) / 4)

+ madd[TheDate.getMonth()]

+ TheDate.getDate()

- 23;

if (TheDate.getYear() % 4 == 0 && TheDate.

getMonth() > 1)

total++;

for (m = 0; ; m++) {

k = (CalendarData[m] < 0xfff) ? 11 : 12;

for (n = k; n >= 0; n--) {

if (total <= 29 + GetBit(CalendarData[m],

n)) {

isEnd = true;

break;

}

total = total - 29 - GetBit(CalendarData

[m], n);

}

if (isEnd) break;

}

cYear = 2001 + m;

cMonth = k - n + 1;

cDay = total;

if (k == 12) {

if (cMonth == Math.floor(CalendarData

[m] / 0x10000) + 1)

cMonth = 1 - cMonth;

if (cMonth > Math.floor(CalendarData[m] /

0x10000) + 1)

cMonth--;

}

cHour = Math.floor((TheDate.getHours()

+ 3) / 2);

}

 

init();

e2c(TheDate);

let tmp = "";

if (cMonth < 1) {

tmp += "闰";

tmp += monString.charAt(-cMonth - 1);

}

else

tmp += monString.charAt(cMonth - 1);

tmp += "月";

tmp += (cDay < 11) ? "初" : ((cDay < 20) ? "十" :

((cDay < 30) ? "廿" : "卅"));

if (cDay % 10 != 0 || cDay == 10)

tmp += numString.charAt((cDay - 1) % 10);

if (cHour == 13) tmp += "夜";

return tmp;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值