背景:一个人出生在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计算每年立春日和生肖的接口,源码如下:

/**
* 该方法只能正确判定到2099年
* @auther 黑MAO
* @time 2014年7月19日
*/
;(function(window){ /**
* 生肖构造函数,默认参数是当前日期
* @param {Number} year 年
* @param {Number} month 月
* @param {Number} day 日
*/
function Zodiac(year, month, day) {
var date = new Date();
this.year = year*1 || date.getFullYear();
this.month = month*1 || date.getMonth();
this.day = day*1 || date.getDate();
} Zodiac.constructor = Zodiac; /**
* 获取C值
* @return {Number} C
*/
Zodiac.prototype.getC = function(){
var _year = Math.floor(this.year/100)+1;
var C; switch(_year){
case 20:
C = 4.6295;
break;
case 21:
C = 3.87;
break;
case 22:
C = 4.15;
break;
default:
C = 3.87;
}
return C;
} /**
* 获取立春日 一般都在2月
* @return {Number} springDay
*/
Zodiac.prototype.getSpringDay = function(){
var Y = this.year%100,
D = 0.2422,
C = this.getC(),
L = (Y-1)/4,
springDay = 0;
springDay = Math.floor(Y*D+C)-Math.floor((Y-1)/4);
return springDay;
} /**
* 获取生肖
* @return {String} myZodiac
*/
Zodiac.prototype.getZodiac = function(){
var year = this.year,
month = this.month,
day = this.day,
zodiac = ['子鼠','丑牛','寅虎','卯兔','辰龙','巳蛇','午马','未羊','申猴','酉鸡','戌狗','亥猪'],
myPos = (year-1900)%12,
myZodiac = zodiac[myPos],
springDay = this.getSpringDay(); switch(month){
case 1:
var _myPos = myPos-1;
if(_myPos<0){
_myPos = 11;
}
myZodiac = zodiac[_myPos];
break;
case 2:
if(day < springDay){
var _myPos = myPos-1;
if(_myPos<0){
_myPos = 11;
}
myZodiac = zodiac[_myPos];
}
break;
}
return myZodiac;
} window.Zodiac = Zodiac;
})(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());
}
 
 
可以计算你的真正生肖了~~
 
参考资料:
http://www.baike.com/wiki/立春日
 
 

JS帮你计算属相的更多相关文章

  1. js字符串长度计算(一个汉字==两个字符)和字符串截取

    js字符串长度计算(一个汉字==两个字符)和字符串截取 String.prototype.realLength = function() { return this.replace(/[^\x00-\ ...

  2. 在js脚本里计算多个小数的加法问题

    当在js脚本里计算多个小数的加法时,算得的结果往往会自动取整,这时候我们就应该加入以下代码: function toDecimal(x) { var val = Number(x); if (!isN ...

  3. vue.js初探:计算属性和methods

    在vue.js中,计算属性和methods方法的函数相同时,两者的最终执行结果都是相同的.然而不同的是,计算属性是基于它的依赖缓存.计算属性只有在它的相关依赖发生改变时才会重新取值.这就意味着只要 m ...

  4. Vue.js学习 Item5 -- 计算属性computed与$watch

    在模板中绑定表达式是非常便利的,但是它们实际上只用于简单的操作.模板是为了描述视图的结构.在模板中放入太多的逻辑会让模板过重且难以维护.这就是为什么 Vue.js 将绑定表达式限制为一个表达式.如果需 ...

  5. js浮点数的计算

        js在计算浮点数时可能不够准确,会产生舍入误差的问题,这是使用基于IEEE745数值的浮点计算的通病,并非ECMAScript一家,其他使用相同数值格式的语言也存在这个问题.     这里讲一 ...

  6. js 浮点小数计算精度问题 parseFloat 精度问题

    在js中进行以元为单位进行金额计算时 使用parseFloat会产生精度问题 var price = 10.99; var quantity = 7; var needPay = parseFloat ...

  7. js中数字计算精度

    其实同样的问题在java中也有存在,同样是浮点数的问题 问题这样的: 37.5*5.5=206.08 (JS算出来是这样的一个结果,我四舍五入取两位小数) 我先怀疑是四舍五入的问题,就直接用JS算了一 ...

  8. C#编程实践–帮老婆计算产假方案

    摘要 今天中午午休时,和老婆聊天,老婆还过几天就要请产假了,她在网上问我让我帮她数一下该怎么请假最划算,老婆是个会过日子的人,面对此种要求我当然义不容辞,不过想到这个问题我的第一反应是:这个怎么可以用 ...

  9. js中角度计算

    -. js 关于三角函数算法  弧度 和 角度的理解, 以及相互转换   角的两种单位 度 和 弧      1.弧度的定义       我们知道"度"的定义是,"两条射 ...

随机推荐

  1. 马士兵 Servlet_JSP(3) Servlet和JSP的通信(源代码)

    (1)从JSP调用Servlet可用<jsp:forward>,请求信息自动转到Servlet FromJspToServlet.jsp <html>     <body ...

  2. 传智播客 Html基础知识学习笔记2

    一.<select>标签 用来创建类似于WinForm中的ComboBox(下拉列表)或者LisBox 如果size大于1就是LisBox,否则就是ComboBox; <select ...

  3. Spring 的优秀工具类盘点第 2 部分

    特殊字符转义 由于 Web 应用程序需要联合使用到多种语言,每种语言都包含一些特殊的字符,对于动态语言或标签式的语言而言,如果需要动态构造语言的内容时,一个我们经常会碰到的问题就是特殊字符转义的问题. ...

  4. 关于win8开发的一点小总结

    我今天做画面的时候,发现了一点小问题. 我在xmal文件里面加了一个CheckBox控件,设置IsChecked属性为True,并添加了Checked事件.Checked事件里面有对另外一个TextB ...

  5. Visual Studio 2008项目中WinForm窗口图标显示为类图标,仅仅能打开代码而无法打开视图问题解决

    背景:         今天打开一个Winform项目的时候.图标显示为类文件的样子而不是窗口的样子,在代码中右键也没有View Designer选项.双击图标打开的是代码而非窗口设计界面,百度后也没 ...

  6. WebSphere之wasprofile.sh使用

    概要文件(profile) 6.0版本以后才有profile,目的是将用户数据和was本身的文件分开,这样可以定义多个profile,每个profile相当于一个用户,相当于提供了多用户的支持. pr ...

  7. 开源项目Material Calendar View 学习记录 (一)

    开源项目Material Calendar View 学习记录 Github: https://github.com/prolificinteractive/material-calendarview ...

  8. C#holle world

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  9. UVA442 栈

    C - Matrix Chain Multiplication Crawling in process... Crawling failed Time Limit:3000MS     Memory ...

  10. 【译】神经网络与深度学习 Ch1-Section0

    用神经网络识别手写数字 人类的视觉系统是是大自然的奇迹.考虑下面手写数字序列: 大多数人能够轻易地是识别出是504192.在我们大脑的每个半球都有一个基础的皮质,这就是我们熟知的V1区,它包含了14亿 ...