内容字号: 默认 大号 超大号

段落设置:段首缩进取消段首缩进

字体设置:切换到宋体切换到微软雅黑

1900年至2100年公历转农历、节假日、周末、节气等

发布:2018-05-17 浏览: 评论(

注:参考资料来自百度

/**用法1:
//每一天对应的星期几
var week=date2holiday(“2018/05/17”).cnWeekDay;//四

//用法2:
var dayStr="2018/05/19";
if(date2holiday(dayStr).weekDay==0 || date2holiday(dayStr).weekDay==6){
    console.log(dayStr+"是周末");
}

**/


(function() {
	var yearBitTable = [43856, 19416, 19168, 42352, 21717, 53856, 55632, 25940, 22191, 39632, 21970, 19168, 42422, 42192, 53840, 53845, 46415, 54944, 44450, 38320, 18807, 18815, 42160, 46261, 27216, 27968, 43860, 11119, 38256, 21234, 18800, 25958, 54432, 59984, 27285, 23263, 11104, 34531, 37615, 51415, 51551, 54432, 55462, 46431, 22176, 42420, 9695, 37584, 53938, 43344, 46423, 27808, 46416, 21333, 19887, 42416, 17779, 21183, 43432, 59728, 27296, 44710, 43856, 19296, 43748, 42352, 21088, 62051, 55632, 23383, 22176, 38608, 19925, 19152, 42192, 54484, 53840, 54616, 46400, 46752, 38310, 38335, 18864, 43380, 42160, 45690, 27216, 27968, 44870, 43872, 38256, 19189, 18800, 25776, 29859, 59984, 27480, 23232, 43872, 38613, 37600, 51552, 55636, 54432, 55888, 30034, 22176, 43959, 9680, 37584, 51893, 43344, 46240, 47780, 44368, 21977, 19360, 42416, 20854, 21183, 43312, 31060, 27296, 44368, 23378, 19296, 42726, 42208, 53856, 60005, 54576, 23200, 30371, 38608, 19195, 19152, 42192, 53430, 53855, 54560, 56645, 46496, 22224, 21938, 18864, 42359, 42160, 43600, 45653, 27951, 44448, 19299, 37759, 18936, 18800, 25776, 26790, 59999, 27424, 42692, 43759, 37600, 53987, 51552, 54615, 54432, 55888, 23893, 22176, 42704, 21972, 21200, 43448, 43344, 46240, 46758, 44368, 21920, 43940, 42416, 21168, 45683, 26928, 29495, 27296, 44368, 19285, 19311, 42352, 21732, 53856, 59752, 54560, 55968, 27302, 22239, 19168, 43476, 42192, 53584, 62034, 54560];
	// 1900-2100各年的24节气日期表
	var solarTermsTable = ["9778397bd097c36b0b6fc9274c91aa", "97b6b97bd19801ec9210c965cc920e", "97bcf97c3598082c95f8c965cc920f", "97bd0b06bdb0722c965ce1cfcc920f", "b027097bd097c36b0b6fc9274c91aa", "97b6b97bd19801ec9210c965cc920e", "97bcf97c359801ec95f8c965cc920f", "97bd0b06bdb0722c965ce1cfcc920f", "b027097bd097c36b0b6fc9274c91aa", "97b6b97bd19801ec9210c965cc920e", "97bcf97c359801ec95f8c965cc920f", "97bd0b06bdb0722c965ce1cfcc920f", "b027097bd097c36b0b6fc9274c91aa", "9778397bd19801ec9210c965cc920e", "97b6b97bd19801ec95f8c965cc920f", "97bd09801d98082c95f8e1cfcc920f", "97bd097bd097c36b0b6fc9210c8dc2", "9778397bd197c36c9210c9274c91aa", "97b6b97bd19801ec95f8c965cc920e", "97bd09801d98082c95f8e1cfcc920f", "97bd097bd097c36b0b6fc9210c8dc2", "9778397bd097c36c9210c9274c91aa", "97b6b97bd19801ec95f8c965cc920e", "97bcf97c3598082c95f8e1cfcc920f", "97bd097bd097c36b0b6fc9210c8dc2", "9778397bd097c36c9210c9274c91aa", "97b6b97bd19801ec9210c965cc920e", "97bcf97c3598082c95f8c965cc920f", "97bd097bd097c35b0b6fc920fb0722", "9778397bd097c36b0b6fc9274c91aa", "97b6b97bd19801ec9210c965cc920e", "97bcf97c3598082c95f8c965cc920f", "97bd097bd097c35b0b6fc920fb0722", "9778397bd097c36b0b6fc9274c91aa", "97b6b97bd19801ec9210c965cc920e", "97bcf97c359801ec95f8c965cc920f", "97bd097bd097c35b0b6fc920fb0722", "9778397bd097c36b0b6fc9274c91aa", "97b6b97bd19801ec9210c965cc920e", "97bcf97c359801ec95f8c965cc920f", "97bd097bd097c35b0b6fc920fb0722", "9778397bd097c36b0b6fc9274c91aa", "97b6b97bd19801ec9210c965cc920e", "97bcf97c359801ec95f8c965cc920f", "97bd097bd07f595b0b6fc920fb0722", "9778397bd097c36b0b6fc9210c8dc2", "9778397bd19801ec9210c9274c920e", "97b6b97bd19801ec95f8c965cc920f", "97bd07f5307f595b0b0bc920fb0722", "7f0e397bd097c36b0b6fc9210c8dc2", "9778397bd097c36c9210c9274c920e", "97b6b97bd19801ec95f8c965cc920f", "97bd07f5307f595b0b0bc920fb0722", "7f0e397bd097c36b0b6fc9210c8dc2", "9778397bd097c36c9210c9274c91aa", "97b6b97bd19801ec9210c965cc920e", "97bd07f1487f595b0b0bc920fb0722", "7f0e397bd097c36b0b6fc9210c8dc2", "9778397bd097c36b0b6fc9274c91aa", "97b6b97bd19801ec9210c965cc920e", "97bcf7f1487f595b0b0bb0b6fb0722", "7f0e397bd097c35b0b6fc920fb0722", "9778397bd097c36b0b6fc9274c91aa", "97b6b97bd19801ec9210c965cc920e", "97bcf7f1487f595b0b0bb0b6fb0722", "7f0e397bd097c35b0b6fc920fb0722", "9778397bd097c36b0b6fc9274c91aa", "97b6b97bd19801ec9210c965cc920e", "97bcf7f1487f531b0b0bb0b6fb0722", "7f0e397bd097c35b0b6fc920fb0722", "9778397bd097c36b0b6fc9274c91aa", "97b6b97bd19801ec9210c965cc920e", "97bcf7f1487f531b0b0bb0b6fb0722", "7f0e397bd07f595b0b6fc920fb0722", "9778397bd097c36b0b6fc9274c91aa", "97b6b97bd19801ec9210c9274c920e", "97bcf7f0e47f531b0b0bb0b6fb0722", "7f0e397bd07f595b0b0bc920fb0722", "9778397bd097c36b0b6fc9210c91aa", "97b6b97bd197c36c9210c9274c920e", "97bcf7f0e47f531b0b0bb0b6fb0722", "7f0e397bd07f595b0b0bc920fb0722", "9778397bd097c36b0b6fc9210c8dc2", "9778397bd097c36c9210c9274c920e", "97b6b7f0e47f531b0723b0b6fb0722", "7f0e37f5307f595b0b0bc920fb0722", "7f0e397bd097c36b0b6fc9210c8dc2", "9778397bd097c36b0b70c9274c91aa", "97b6b7f0e47f531b0723b0b6fb0721", "7f0e37f1487f595b0b0bb0b6fb0722", "7f0e397bd097c35b0b6fc9210c8dc2", "9778397bd097c36b0b6fc9274c91aa", "97b6b7f0e47f531b0723b0b6fb0721", "7f0e27f1487f595b0b0bb0b6fb0722", "7f0e397bd097c35b0b6fc920fb0722", "9778397bd097c36b0b6fc9274c91aa", "97b6b7f0e47f531b0723b0b6fb0721", "7f0e27f1487f531b0b0bb0b6fb0722", "7f0e397bd097c35b0b6fc920fb0722", "9778397bd097c36b0b6fc9274c91aa", "97b6b7f0e47f531b0723b0b6fb0721", "7f0e27f1487f531b0b0bb0b6fb0722", "7f0e397bd097c35b0b6fc920fb0722", "9778397bd097c36b0b6fc9274c91aa", "97b6b7f0e47f531b0723b0b6fb0721", "7f0e27f1487f531b0b0bb0b6fb0722", "7f0e397bd07f595b0b0bc920fb0722", "9778397bd097c36b0b6fc9274c91aa", "97b6b7f0e47f531b0723b0787b0721", "7f0e27f0e47f531b0b0bb0b6fb0722", "7f0e397bd07f595b0b0bc920fb0722", "9778397bd097c36b0b6fc9210c91aa", "97b6b7f0e47f149b0723b0787b0721", "7f0e27f0e47f531b0723b0b6fb0722", "7f0e397bd07f595b0b0bc920fb0722", "9778397bd097c36b0b6fc9210c8dc2", "977837f0e37f149b0723b0787b0721", "7f07e7f0e47f531b0723b0b6fb0722", "7f0e37f5307f595b0b0bc920fb0722", "7f0e397bd097c35b0b6fc9210c8dc2", "977837f0e37f14998082b0787b0721", "7f07e7f0e47f531b0723b0b6fb0721", "7f0e37f1487f595b0b0bb0b6fb0722", "7f0e397bd097c35b0b6fc9210c8dc2", "977837f0e37f14998082b0787b06bd", "7f07e7f0e47f531b0723b0b6fb0721", "7f0e27f1487f531b0b0bb0b6fb0722", "7f0e397bd097c35b0b6fc920fb0722", "977837f0e37f14998082b0787b06bd", "7f07e7f0e47f531b0723b0b6fb0721", "7f0e27f1487f531b0b0bb0b6fb0722", "7f0e397bd097c35b0b6fc920fb0722", "977837f0e37f14998082b0787b06bd", "7f07e7f0e47f531b0723b0b6fb0721", "7f0e27f1487f531b0b0bb0b6fb0722", "7f0e397bd07f595b0b0bc920fb0722", "977837f0e37f14998082b0787b06bd", "7f07e7f0e47f531b0723b0b6fb0721", "7f0e27f1487f531b0b0bb0b6fb0722", "7f0e397bd07f595b0b0bc920fb0722", "977837f0e37f14998082b0787b06bd", "7f07e7f0e47f149b0723b0787b0721", "7f0e27f0e47f531b0b0bb0b6fb0722", "7f0e397bd07f595b0b0bc920fb0722", "977837f0e37f14998082b0723b06bd", "7f07e7f0e37f149b0723b0787b0721", "7f0e27f0e47f531b0723b0b6fb0722", "7f0e397bd07f595b0b0bc920fb0722", "977837f0e37f14898082b0723b02d5", "7ec967f0e37f14998082b0787b0721", "7f07e7f0e47f531b0723b0b6fb0722", "7f0e37f1487f595b0b0bb0b6fb0722", "7f0e37f0e37f14898082b0723b02d5", "7ec967f0e37f14998082b0787b0721", "7f07e7f0e47f531b0723b0b6fb0722", "7f0e37f1487f531b0b0bb0b6fb0722", "7f0e37f0e37f14898082b0723b02d5", "7ec967f0e37f14998082b0787b06bd", "7f07e7f0e47f531b0723b0b6fb0721", "7f0e37f1487f531b0b0bb0b6fb0722", "7f0e37f0e37f14898082b072297c35", "7ec967f0e37f14998082b0787b06bd", "7f07e7f0e47f531b0723b0b6fb0721", "7f0e27f1487f531b0b0bb0b6fb0722", "7f0e37f0e37f14898082b072297c35", "7ec967f0e37f14998082b0787b06bd", "7f07e7f0e47f531b0723b0b6fb0721", "7f0e27f1487f531b0b0bb0b6fb0722", "7f0e37f0e366aa89801eb072297c35", "7ec967f0e37f14998082b0787b06bd", "7f07e7f0e47f149b0723b0787b0721", "7f0e27f1487f531b0b0bb0b6fb0722", "7f0e37f0e366aa89801eb072297c35", "7ec967f0e37f14998082b0723b06bd", "7f07e7f0e47f149b0723b0787b0721", "7f0e27f0e47f531b0723b0b6fb0722", "7f0e37f0e366aa89801eb072297c35", "7ec967f0e37f14998082b0723b06bd", "7f07e7f0e37f14998083b0787b0721", "7f0e27f0e47f531b0723b0b6fb0722", "7f0e37f0e366aa89801eb072297c35", "7ec967f0e37f14898082b0723b02d5", "7f07e7f0e37f14998082b0787b0721", "7f07e7f0e47f531b0723b0b6fb0722", "7f0e36665b66aa89801e9808297c35", "665f67f0e37f14898082b0723b02d5", "7ec967f0e37f14998082b0787b0721", "7f07e7f0e47f531b0723b0b6fb0722", "7f0e36665b66a449801e9808297c35", "665f67f0e37f14898082b0723b02d5", "7ec967f0e37f14998082b0787b06bd", "7f07e7f0e47f531b0723b0b6fb0721", "7f0e36665b66a449801e9808297c35", "665f67f0e37f14898082b072297c35", "7ec967f0e37f14998082b0787b06bd", "7f07e7f0e47f531b0723b0b6fb0721", "7f0e26665b66a449801e9808297c35", "665f67f0e37f1489801eb072297c35", "7ec967f0e37f14998082b0787b06bd", "7f07e7f0e47f531b0723b0b6fb0721", "7f0e27f1487f531b0b0bb0b6fb0722"];
	var arrSolarTerms = ["小寒", "大寒", "立春", "雨水", "惊蛰", "春分", "清明", "谷雨", "立夏", "小满", "芒种", "夏至", "小暑", "大暑", "立秋", "处暑", "白露", "秋分", "寒露", "霜降", "立冬", "小雪", "大雪", "冬至"];
	var h = ["甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸"];
	var d = ["子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥"];
	var arrAnimals = ["鼠", "牛", "虎", "兔", "龙", "蛇", "马", "羊", "猴", "鸡", "狗", "猪"];
	var k = ["初", "十", "廿", "三十"];
	var g = ["", "一", "二", "三", "四", "五", "六", "七", "八", "九"];
	var arrChineseMonthTitles = ["正", "二", "三", "四", "五", "六", "七", "八", "九", "十", "十一", "腊"];
	// 阴历相关计算函数
	var fnLunar = {
		yearDataCache: {},
		getDate: function(u) {
			var x = Math.ceil((u - new Date(1899,1,10)) / 86400000);
			var w = 1899;
			var s;
			var r;
			var q;
			var t;
			var v;
			for (; w < 2100 && x > 0; w++) {
				s = this.getYearDays(w);
				x -= s
			}
			x < 0 && (x += s, w--);
			q = w;
			r = this.getLeapMonth(q) || false;
			for (w = 1; w <= 12; w++) {
				s = this.getMonthDays(q, w);
				if (r === true) {
					r = false;
					w--;
					s = this.getLeapDays(q);
					if (x < s) {
						t = true
					}
				}
				if (r === w) {
					r = true
				}
				if (x < s) {
					v = s === 30;
					break
				}
				x -= s
			}
			return {
				lunarYear: q,
				lunarMonth: w,
				lunarDay: x + 1,
				isLeap: t,
				isBigMonth: v
			}
		},
		// 返回农历年一整年的总天数
		getYearDays: function(q) {
			var r;
			var t = this.yearDataCache;
			if (t[q]) {
				return t[q]
			}
			var s = 348;
			var u = yearBitTable[q - 1899];
			for (r = 32768; r > 8; r >>= 1) {
				s += r & u ? 1 : 0
			}
			s += this.getLeapDays(q);
			t[q] = s;
			return s
		},
		// 返回农历年闰月的天数 若该年没有闰月则返回0
		getLeapDays: function(q) {
			return this.getLeapMonth(q) ? (yearBitTable[q - 1899 + 1] & 15 === 15 ? 30 : 29) : 0
		},
		// 返回农历年闰月是哪个月;若年没有闰月 则返回0
		getLeapMonth: function(r) {
			var q = yearBitTable[r - 1899] & 15;
			return q == 15 ? 0 : q
		},
		// 返回农历y年m月(非闰月)的总天数,计算m为闰月时的天数请使用 getLeapDays 方法
		getMonthDays: function(y, m) {
			return (yearBitTable[y - 1899] & (65536 >> m)) ? 30 : 29
		}
	};
	// 农历1900-2100的闰大小信息 return: hex 2 DateTime
	var getLeapYearTime = function(year, doubleMonth) {
		var v = solarTermsTable[year - 1900];
		var hex = [];
		var s = 0;
		var q;
		for (; s < 30; s += 5) {
			q = (+("0x" + v.substr(s, 5))).toString();
			hex.push(q.substr(0, 1));
			hex.push(q.substr(1, 2));
			hex.push(q.substr(3, 1));
			hex.push(q.substr(4, 2));
		}
		return new Date(year,parseInt(doubleMonth / 2, 10),hex[doubleMonth]);
	};
	// 阴历相关计算函数(获得数字年份/月份/日期 等)
	var fnLunarDate = {
		calculate: function(q) {
			return h[q % 10] + d[q % 12]
		},
		getGzYear: function(r, s, q) {
			return this.calculate(s - 1900 + 36 - (q === s ? 0 : 1))
		},
		getGzMonth: function(q, r, s) {
			var t = getLeapYearTime(r, q.getMonth() * 2);
			return this.calculate((r - 1900) * 12 + s + 12 - (q < t ? 1 : 0))
		},
		getGzDay: function(q) {
			return this.calculate(Math.ceil(q / 86400000 + 25567 + 10))
		}
	};
	// 节假日(除夕需要动态算)
	var oFestivals = {
		t0101: "t,春节 ",
		t0115: "t,元宵节",
		t0202: "t,龙头节",
		t0505: "t,端午节",
		t0707: "t,七夕节",
		t0715: "t,中元节",
		t0815: "t,中秋节",
		t0909: "t,重阳节",
		//t1001: "t,寒衣节",
		//t1015: "t,下元节",
		t1208: "t,腊八节",
		t1223: "t,小年",
		//"0202": "i,湿地日,1996",
		"0308": "i,妇女节,1975",
		//"0315": "i,消费者权益日,1983",
		"0401": "i,愚人节,1564",
		//"0422": "i,地球日,1990",
		"0501": "i,劳动节,1889",
		//"0512": "i,护士节,1912",
		//"0518": "i,博物馆日,1977",
		//"0605": "i,环境日,1972",
		//"0623": "i,奥林匹克日,1948",
		//"1020": "i,骨质疏松日,1998",
		//"1117": "i,学生日,1942",
		//"1201": "i,艾滋病日,1988",
		"0101": "h,元旦",
		"0312": "h,植树节,1979",
		"0504": "h,五四青年节,1939",
		"0601": "h,儿童节,1950",
		"0701": "h,建党节,1941",
		"0801": "h,建军节,1933",
		//"0903": "h,抗战胜利日,1945",
		"0910": "h,教师节,1985",
		"1001": "h,国庆节,1949",
		"1224": "c,平安夜",
		"1225": "c,圣诞节",
		"0214": "a,情人节",
		extra: { // 前2位代表月份,第3位是第几个星期,第4位是星期几
			"0520": "i,母亲节,1913",
			"0630": "a,父亲节",
			"1144": "a,感恩节"
		}
	};
	var zeroPad = function(num) { // 填充零
		return num < 10 ? "0" + num : num;
	};
	var getFestival = function(oDate, lunarInfo) {
		var _year = oDate.getFullYear();
		var _month = oDate.getMonth() + 1;
		var _date = oDate.getDate();
		var _day = oDate.getDay();
		var _week = Math.ceil(_date / 7);
		var _extra = zeroPad(_month) + _week + _day;
		var _traditional = "t" + zeroPad(lunarInfo.lunarMonth) + zeroPad(lunarInfo.lunarDay);
		var _normal = zeroPad(_month) + zeroPad(_date);
		var arrHolidays = [];
		var item;
		if (lunarInfo.lunarMonth === 12 && lunarInfo.lunarDay === (lunarInfo.isBigMonth ? 30 : 29)) {
			arrHolidays.push("t,除夕");
		}
		arrHolidays = arrHolidays.concat([oFestivals.extra[_extra], oFestivals[_normal], oFestivals[_traditional]]);
		var i = 0;
		for (; i < arrHolidays.length; i++) {
			if (arrHolidays[i]) {
				item = arrHolidays[i].split(",");
				if (item[2] && _year < item[2]) {
					arrHolidays[i] = null ;
					continue;
				}
				arrHolidays[i] = {
					type : item[0],
					desc : item[1],
					value: item[1]
				}
			}
		}
		arrHolidays.sort(function(a, b) { // 按 type 字母倒序排列(靠后的字母权重高,会排到前面)
			if (a && b) {
				return b.type.charCodeAt(0) - a.type.charCodeAt(0)
			}
			return !a ? 1 : -1;
		});
		return $.map(arrHolidays, function(item) {
			return item;
		});
	};
	var init = function(oDate) {
		var _year  = oDate.getFullYear();
		var _month = oDate.getMonth() + 1;
		var _date  = oDate.getDate();
		var doubleMonth = (_month - 1) * 2;
		var s = getLeapYearTime(_year, doubleMonth);
		var q;
		var solarTerm = "";
		var holiday = '';
		if (_date != s.getDate()) {
			q = getLeapYearTime(_year, doubleMonth + 1);
			if (_date == q.getDate()) {
				solarTerm = arrSolarTerms[doubleMonth + 1]
			}
		} else {
			solarTerm = arrSolarTerms[doubleMonth]
		}
		var lunarInfo = fnLunar.getDate(oDate);
		var weekDay = oDate.getDay();
		var festivals = getFestival(oDate, lunarInfo);
		return {
			animal     : arrAnimals[(lunarInfo.lunarYear - 4) % 12],               // 生肖
			gzDate     : fnLunarDate.getGzDay(oDate),                              // 阴历日期
			gzMonth    : fnLunarDate.getGzMonth(oDate, _year, _month),             // 阴历月份
			gzYear     : fnLunarDate.getGzYear(oDate, _year, lunarInfo.lunarYear), // 阴历年份
			lunarYear  : lunarInfo.lunarYear,                                      // 阴历数字年份
			lunarMonth : lunarInfo.lunarMonth,                                     // 阴历数字月份
			lunarDate  : lunarInfo.lunarDay,                                       // 阴历数字日期
			lMonth     : (lunarInfo.isLeap ? "闰" : "") + arrChineseMonthTitles[lunarInfo.lunarMonth - 1], // 阴历月份数字对应汉字月份
			lDate: lunarInfo.lunarDay % 10 == 0 ? ["初十", "二十", "三十"][lunarInfo.lunarDay / 10 - 1] : k[parseInt(lunarInfo.lunarDay / 10, 10)] + g[parseInt(lunarInfo.lunarDay % 10, 10)], // 阴历日期数字对应汉字日期
			solarTerm: solarTerm, // 节气
			//festival: function() { // 没啥用
			//	return getFestival(oDate, lunarInfo);
			//},
			festivals  : festivals,                 // 获取对应的节假日
			isBigMonth : lunarInfo.isBigMonth,      // 阴历30天为true,29年为false
			oDate      : oDate,                     // 公历日期对象
			weekDay    : weekDay,                   // 公历一周中的第几天,从0开始(0表示周日)
			cnWeekDay  : "日一二三四五六".charAt(weekDay), // 公历星期几
			holiday: festivals.length ? festivals[0].value : solarTerm ? solarTerm : '' // 如果有多个节假日,返回一个(有节日则返回权重最高的一个,没有的话就返回节气,再没有就返回空值)
		};
	};
	window.date2holiday = function(dateStr) {
		var oDate = new Date(dateStr.replace(/\-/g, '/'));
		return init(oDate);
	};
})();
前端新手交流群
欢迎加入web前端新手交流qq群:734802480

更多文章

相关文章

评论

发表评论愿您的每句评论,都能给大家的生活添色彩,带来共鸣,带来思索,带来快乐。


Copyright © 2014-2019 seozhijia.net 版权所有-粤ICP备13087626号-4