这是我参与2022首次更文挑战的第5天,活动详情查看:2022首次更文挑战
题目描述
给一个具体的日期,然后你要计算出它是属于一周的哪一天。
提供三个参数,day(天), month(月), year(年)。
返回值是以下值的一项。
['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']
补充:给出的日期一定是在 1971 到 2100 年之间的有效日期。
思路分析
第一种方法
我们可以利用date实例有个方法,getDay方法。
这个方法是返回date实例处于一周的第几天,这刚好对应上题目的需求。
于是,我们只需要把返回值当作索引,去数组 ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'] 中到对应的值返回即可。
代码如下:
/**
* @param {number} day
* @param {number} month
* @param {number} year
* @return {string}
*/
var dayOfTheWeek = function (day, month, year) {
const date = new Date(`${year}/${month}/${day}`)
return ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'][date.getDay()]
};
但是如果不能使用date对象的现成api,可否实现这个需求呢?
答案是肯定能的。
第二种方法
第二种方法有个前提条件,我们需要知道 '1970/12/31'是周四 。我们首先需要知道这个前提条件。
然后我们计算给定的日期距离1970/12/31是多少天,然后对它除以7(因为一周7天)取余,余数就是一周的第几天。
这里需要注意,因为年份有闰年和平年之分,这里需要判断当前年份是不是闰年,如果是需要对二月设置成29天,否则设置成28天。
闰年的判断:
- 年份如果能被100整除,则能被400整除,就是闰年
- 年份不能被100整数,则能被4整除,就是闰年
- 不满足以上条件都是平年
然后我们就从1971年开始遍历,然后把每年的天数加起来,遍历到当前年的时候,只需要把当前的月份和天数加上就可。
最后把它除以7取余,就是一周的第几天。
代码如下:
/**
* @param {number} day
* @param {number} month
* @param {number} year
* @return {string}
*/
var dayOfTheWeek = function (day, month, year) {
// '1970/12/31'是周四
const weekArr = ['Thursday', 'Friday', 'Saturday', 'Sunday', 'Monday', 'Tuesday', 'Wednesday']
const isLeapYear = (y) => y % 100 === 0 ? y % 400 === 0 : y % 4 === 0
let monthArr = [31, , 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
let days = 0
for (let y = 1971; y <= year; y++) {
monthArr[1] = isLeapYear(y) ? 29 : 28
if (y < year) {
days = monthArr.reduce((acc, cur) => acc + cur, days)
} else {
days = monthArr.slice(0, month - 1).reduce((acc, cur) => acc + cur, days)
days += day
}
}
return weekArr[days % 7]
};