2017-08-27 269 views
1

因此,我有一個函數,它接收日期並返回該日期從週一到週日的那一週的每一天。獲取基於給定日期的星期一至星期日

因此,例如:

input into function: 2017-08-24T19:37:09-04:00

將返回數組:

[ 
    "2017-08-21T19:37:09-04:00", 
    "2017-08-22T19:37:09-04:00", 
    "2017-08-23T19:37:09-04:00", 
    "2017-08-24T19:37:09-04:00", 
    "2017-08-25T19:37:09-04:00", 
    "2017-08-26T19:37:09-04:00", 
    "2017-08-27T19:37:09-04:00" 
] 

這是我迄今(我使用momentjs)代碼:

function getMonday(d) { 
    d = new Date(d); 
    var day = d.getDay() || 7; 
    var diff = d.getDate() - day + (day == 0 ? -6:1); 
    for (var i = 0; i <= 6; i++) { 
     var date = new Date(d.setDate(diff+i)); 
     dateRange.push(moment(date).format()); 
     console.log(dateRange); 
    } 
} 

所以這工作正常,但它失敗時輸入是:getMonday(new Date('2017-07-31T19:44:06-04:00')) ...

在這種情況下,它返回:

2017-07-31T19:44:06-04:00 2017-08-01T19:44:06-04:00 2017-09-02T19:44:06-04:00 2017-10-04T19:44:06-04:00 2017-11-04T19:44:06-04:00 2017-12-06T19:44:06-04:00 2018-01-06T19:44:06-04:00

,因爲它是遞增月這顯然是錯誤的...

這是怎麼回事?有沒有一種方法可以輕鬆解決我缺少的問題?

謝謝!

回答

2

的問題似乎是,你是diff + i在各環路,給予原日的日說31的,最終每一次碰撞d上漲約一個月變異d

像這樣的東西應該是簡單

function getMonday(inputDate) { 
 
    let d = new Date(inputDate) 
 
    let out = [] 
 
    
 
    // set to "Sunday" for the previous week 
 
    d.setDate(d.getDate() - (d.getDay() || 7)) // if getDay is 0 (Sunday), take 7 days 
 
    for (let i = 0; i < 7; i++) { // note, the value of i is unused 
 
    out.push(new Date(d.setDate(d.getDate() + 1))) // increment by one day 
 
    } 
 
    return out 
 
} 
 

 
const input = '2017-08-27T19:44:06' 
 
console.info(getMonday(input).map(d => d.toString()))

+1

非常漂亮和乾淨的代碼..我只是有一個問題,當'輸入=「2017-08-27T19:44:06 -04:00'',因爲它不會在特定周內返回「星期一至星期日」,它會在下週顯示它...有什麼想法? –

+0

@JaneDoe啊,問題是我的代碼假設星期天爲一週的第一天,而不是最後一天。我會看看我能做什麼 – Phil

+0

@JaneDoe現在應該都很好 – Phil

相關問題