# 一周中的第几天(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

# 基姆拉尔森公式

(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