前言
這是今天遇到的面試題,題目
寫一個函數,判斷給定的日期是幾月的第幾周,當月1日屬于上一月的,該周計入上一月。例如:
1)輸入日期2016-02-01,返回結果為2-1,表示2016年2月1日屬于2月的第一周;
2)輸入日期2016-09-01,返回結果為8-5,表示2016年9月1日屬于8月的第五周。
(這里計算一周是從周一到當周周天算為一周;某天是屬于某月的某一周的。以2016年4月為例:4月4日至10日為4月的第一周;4月1日至3日不屬于4月的周次,而是歸入3月計算。)
粗略的網上搜索了一下,不是原題,OK開始動手分析
分析
首先需要把給定日期轉換為一個Date類型
str = Date.parse(str);
str = new Date(str);
這樣我們就可以獲得這個日期的日月年,我們可以根據日期數除以7然后取整得到第幾周數。然后用getMonth()+1得到月數
let week = Math.ceil(str.getDate()/7);
let month = str.getMonth() + 1;
接著完成第二個需求,如果這個月一號不是周一,那么歸為上一周。什么意思呢?
2月天數.png
我們可以看見,3月1號是周三,那么這幾天應該歸為上一周,即2月第5周,因此我們需要判斷一個月的前幾天是否是周一,如果不是則歸為上一周
if (str.getDate() < 7) {
if (str.getDay() !== 1) {
week = 5;
month = str.getMonth();
}
}
這里我們選擇驗證前7天,最后輸出符合題目格式的內容
完整代碼
function getWeek(str) {
// 將字符串轉為標準時間格式
str = Date.parse(str);
str = new Date(str);
// 先計算出該日期為第幾周
let week = Math.ceil(str.getDate()/7);
let month = str.getMonth() + 1;
// 判斷這個月前7天是周幾,如果不是周一,則計入上個月
if (str.getDate() < 7) {
if (str.getDay() !== 1) {
week = 5;
month = str.getMonth();
}
}
console.log(`${month}-${week}`);
}
總結
這個題目考察的是Date類型的使用,我對這部分掌握不怎么牢靠,所以再次翻越了JS高程,照著Date的方法寫的,難點在于處理本月前幾天,看看是不是屬于上個月的周數
就是這樣:)