分析和理解根據日期計算星座函數 本博客根據文章 "根據生日的月份和日期,一行代碼計算星座的js小函數(轉)" 原文出自CSDN "無心的專欄" 的文章,知識產權歸原文作者所有! | 起始月份 | 號數 | 星座 | 結束月份 | 號數 | 時間區間 | | : : | : : | : : | : : ...
分析和理解根據日期計算星座函數
本博客根據文章 根據生日的月份和日期,一行代碼計算星座的js小函數(轉) 原文出自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);
//水瓶