# 一周中的第几天(1185)
# 题目
给你一个日期,请你设计一个算法来判断它是对应一周中的哪一天。
输入为三个整数:day``、month
和 year
,分别表示日、月、年。
您返回的结果必须是这几个值中的一个 {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}
。
# 示例
输入:day = 31, month = 8, year = 2019 输出:"Saturday"
# 算法
# 累加
1971年1月1日是星期五,所以weeks
从周五开始
通过累加判断给定日期到1971.1.1的天数,和7取模计算星期
注意闰年计算
export const dayOfTheWeek = (day, month, year) => {
const weeks = ["Friday", "Saturday", "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday"];
let days = 0;
for (let i = 1971; i < year; i++) {
if ((i % 4 === 0 && i % 100 !== 0) || i % 400 === 0) {
days += 366;
} else {
days += 365;
}
}
for (let i = 1; i < month; i++) {
if (i === 2) {
if ((year % 4 === 0 && year % 100 !== 0) || year % 400 === 0) {
days += 29;
} else {
days += 28;
}
} else if (i === 1 || i === 3 || i === 5 || i === 7 || i === 8 || i === 10 || i === 12) {
days += 31;
} else {
days += 30;
}
}
days += day - 1;
return weeks[days % 7];
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 基姆拉尔森公式
(d + 2m + 3(m+1)/5 + y + y/4 - y/100 + y/400) % 7
,结果[0, 6]
,表示周一到周天
因为公式的每一项都要求是整数,所以需要对/
的计算结果使用Math.floor()
向下取整
export const dayOfTheWeek = (day, month, year) => {
const weeks = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"];
if (month === 1 || month === 2) {
month += 12;
year--;
}
const W =
(day +
2 * month +
Math.floor((3 * (month + 1)) / 5) +
year +
Math.floor(year / 4) -
Math.floor(year / 100) +
Math.floor(year / 400)) %
7;
return weeks[W];
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
← Z字形变换(6) 主要元素(17.10) →