背景:一个人出生在2014年的正月初一,他的生肖到底是属蛇还是属马呢?这就要确定那一天才是一年的开始。是春节还是立春?每年的春节是正月初一,但是生肖必须是从立春日开始计算。春节是1912年孙中山先生废除旧历,采用公元纪年之后的1914年,时任民国大总统的袁世凯颁布法令,每年的正月初一是春节,在此之前传统上都是以二十四节气的立春作为岁首。综上所属,2014年正月初一出生的应该是属蛇。
既然知道了每年的立春日才是真正的生肖判断标准,那么怎么才能获取每年的立春日是多少呢?
网上有这么一个计算立春日的公式:[Y*D+C]-L
公式解读:Y:年数的后2位 D:常量0.2422 C:世纪值,21世纪是3.87 取整数减 L:闰年数。
举例说明:2058年立春日期的计算步骤[58×.0.2422+3.87]-[(58-1)/4]=17-14=3,则2月3日立春
这里提供JS计算每年立春日和生肖的接口,源码如下:
使用方法:
1 /** 2 * 该方法只能正确判定到2099年 3 * @auther 黑MAO 4 * @time 2014年7月19日 5 */ 6 ; 7 (function(window) { 8 9 /** 10 * 生肖构造函数,默认参数是当前日期 11 * @param {Number} year 年 12 * @param {Number} month 月 13 * @param {Number} day 日 14 */ 15 function Zodiac(year, month, day) { 16 var date = new Date(); 17 this.year = year * 1 || date.getFullYear(); 18 this.month = month * 1 || date.getMonth(); 19 this.day = day * 1 || date.getDate(); 20 } 21 22 Zodiac.constructor = Zodiac; 23 24 /** 25 * 获取C值 26 * @return {Number} C 27 */ 28 Zodiac.prototype.getC = function() { 29 var _year = Math.floor(this.year / 100) + 1; 30 var C; 31 32 switch (_year) { 33 case 20: 34 C = 4.6295; 35 break; 36 case 21: 37 C = 3.87; 38 break; 39 case 22: 40 C = 4.15; 41 break; 42 default: 43 C = 3.87; 44 } 45 return C; 46 } 47 48 /** 49 * 获取立春日 一般都在2月 50 * @return {Number} springDay 51 */ 52 Zodiac.prototype.getSpringDay = function() { 53 var Y = this.year % 100, 54 D = 0.2422, 55 C = this.getC(), 56 L = (Y - 1) / 4, 57 springDay = 0; 58 springDay = Math.floor(Y * D + C) - Math.floor((Y - 1) / 4); 59 return springDay; 60 } 61 62 /** 63 * 获取生肖 64 * @return {String} myZodiac 65 */ 66 Zodiac.prototype.getZodiac = function() { 67 var year = this.year, 68 month = this.month, 69 day = this.day, 70 zodiac = ['子鼠', '丑牛', '寅虎', '卯兔', '辰龙', '巳蛇', '午马', '未羊', '申猴', '酉鸡', '戌狗', '亥猪'], 71 myPos = (year - 1900) % 12, 72 myZodiac = zodiac[myPos], 73 springDay = this.getSpringDay(); 74 75 switch (month) { 76 case 1: 77 var _myPos = myPos - 1; 78 if (_myPos < 0) { 79 _myPos = 11; 80 } 81 myZodiac = zodiac[_myPos]; 82 break; 83 case 2: 84 if (day < springDay) { 85 var _myPos = myPos - 1; 86 if (_myPos < 0) { 87 _myPos = 11; 88 } 89 myZodiac = zodiac[_myPos]; 90 } 91 break; 92 } 93 return myZodiac; 94 } 95 96 window.Zodiac = Zodiac; 97 })(window);
//默认参数是当前日期 var zodiac = new Zodiac(); //var zodiac = new Zodiac(1980, 2, 3); //获取立春日 console.log(zodiac.getSpringDay()); //获取生肖 console.log(zodiac.getZodiac()); //可以与万年历进行比对可以计算你的真正生肖了~~ for (var year = 1900; year < 2100; year++) { var zodiac = new Zodiac(year, 2, 4); console.log(year, zodiac.getSpringDay(), zodiac.getZodiac()); }
可以计算你的真正生肖了~~
参考资料:https://www.cnblogs.com/xiaoheimiaoer/p/3854720.html