分析和理解根据日期计算星座函数
本博客根据文章 原文出自CSDN 的文章,知识产权归原文作者所有!
起始月份
号数
星座
结束月份
号数
时间区间
12
22
摩羯座
1
19
12/22 - 1/19
1
20
水瓶座
2
18
1/20 - 2/18
2
19
双鱼座
3
20
2/19 - 3/20
3
21
白羊座
4
20
3/22 - 4/20
4
21
金牛座
5
20
4/22 - 5/20
5
21
双子座
6
21
5/22 - 6/21
6
22
巨蟹座
7
22
6/22 - 7/22
7
23
狮子座
8
22
7/22 - 8/22
8
23
处女座
9
22
8/22 - 9/22
9
23
天秤座
10
22
9/22 - 10/22
10
23
天蝎座
11
21
10/22 - 11/21
11
22
射手座
12
21
11/22 - 12/21
12
22
摩羯座
1
19
12/22 - 1/19
一年12个月份
抽象一个数组
c = [摩羯,水瓶, 双鱼,白羊,金牛,双子,巨蟹,狮子,处女,天秤,天蝎,射手,摩羯]
c 为月份列表
该数组中序号为 1 的水瓶座对应的起始月份为 1月
序号为 起始月份 或者 (结束月份 - 1)
日期所对应的星座 起始月份为日期所在月 或者 终结月份为该月(即起始月份为日期所在月-1)
为了得出日期对应的星座,我们通过日期来计算对应星座的起始月份
startMonth = month - [(day < Date[month]) ? 1 : 0]
c = [摩羯,水瓶, 双鱼,白羊,金牛,双子,巨蟹,狮子,处女,天秤,天蝎,射手,摩羯]
index = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
Date = [22, 20, 19, 21, 21, 21, 22, 23, 23, 23, 23, 22, 22]
startMonth - 计算后对应星座的起始月份;
Month - 日期对应的月份;
day - 日期对应的号数;
Date - 月份列表对应的日期列表;
解释:
对应星座起始月份 = 当前月份 - [(当前日期是否小于对应月份的日期)是则为1,否则为0]
判断(日期对应号数 < 起始月份为日期对应月份的星座的起始号数)
例子 2月18日 为水瓶座 2月19日 为双子座
18 < 19 (19为2月的双鱼座的起始日期) 小于成立即 2 - 1 = 1 一月对应的星座为水瓶座
19 = 19 小于不成立, 2 - 0 = 2 所以为二月对应的星座 双鱼座
简化列表 将日期列表取消
day < Date[month] =》 day - x < Date[month] - x
令 y = Date[month] - x ,y需要为个位数
现在起始日期对应的号数 最小为19号(双鱼座) 最大为23号(狮子座)
穷举并且列出表格
x
y
x + y = 19
x
y
x + y =23
10
9
14
9
√
11
8
15
8
√
12
7
16
7
√
13
6
17
6
√
14
5
√
18
5
√
15
4
√
19
4
√
16
3
√
20
3
17
2
√
21
2
18
1
√
22
1
19
0
√
23
0
两列中x的交集为 14 -19
取x = 14
Date = [22, 20, 19, 21, 21, 21, 22, 23, 23, 23, 23, 22, 22]
date - 14
最后列表为8,6,5,7,7,8,9,9,9,9,8,8 => '865778999988'
startMonth = month - [(day < Date[month]) ? 1 : 0]
=> month - (day - 14 < '865778999988'.charAt(month))
true 自动变为 1;
true 自动变为 0;
charAt为寻找字符串对应位置的str
最终代码
var date = new Date(2017,1,12);
//设置日期
function getHoroscope(date) {
var c = ['摩羯','水瓶','双鱼','白羊','金牛','双子','巨蟹','狮子','处女','天秤','天蝎','射手','摩羯']
var month = date.getMonth() + 1;
var day = date.getDate();
var startMonth = month - (day - 14 < '865778999988'.charAt(month));
return c[startMonth]
}
getHoroscope(date);
//水瓶