JS计算属相

 背景:一个人出生在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

原文地址:https://www.cnblogs.com/tanxiang6690/p/14215256.html