2017-03-24 66 views
2

我試圖讓一個函數得到所有的一週中給定的當天day.I有一個函數,我認爲工作,直到我注意到,如果星期幾接近月底,例如二月,我得到奇怪的數據。任何人都知道發生了什麼以及如何解決它?JS-獲取本週的幾天

Console

function days(current) { 
 
    var week = new Array(); 
 
    // Starting Monday not Sunday 
 
    var first = ((current.getDate() - current.getDay()) + 1); 
 
    for (var i = 0; i < 7; i++) { 
 
    week.push(
 
     new Date(current.setDate(first++)) 
 
    ); 
 
    } 
 
    return week; 
 
} 
 

 
var input = new Date(2017, 1, 27); 
 
console.log('input: %s', input); 
 

 
var result = days(input); 
 
console.log(result.map(d => d.toString()));
.as-console-wrapper{min-height:100%}

回答

2

如果你不想使用某種其他庫像Moment.js你也可以改變你的功能一點,然後它會工作。試試這個:

function dates(current) { 
 
    var week= new Array(); 
 
    // Starting Monday not Sunday 
 
    current.setDate((current.getDate() - current.getDay() +1)); 
 
    for (var i = 0; i < 7; i++) { 
 
     week.push(
 
      new Date(current) 
 
     ); 
 
     current.setDate(current.getDate() +1); 
 
    } 
 
    return week; 
 
} 
 
console.log(dates(new Date(2017, 1, 27)));

+0

任何想法爲什麼會變成這個 new Date(「2017-02-27」);成爲這個 Sun Feb 26 2017 18:00:00 GMT-0600(中部標準時間) – John

+0

@John這是因爲你的時區(GMT-6)。插入到新Date()中的日期需要使用GMT,如果沒有設置時間,將使用0:00h。由於您的時區爲GMT-6,因此您的瀏覽器打印出來的結果將會縮短6個小時,因爲它會轉換爲您的時區。 –

+0

那麼我如何檢測正確的時間,和/或將字符串轉換爲正確的日期對象?我通過像上面那樣的字符串得到我的日期。 – John

-1

您可以使用Moment.js庫 - 工具庫的日期/時間操作

這裏的實施例一的代碼來獲得當前周的日期從週一開始:

function getThisWeekDates() { 
     var weekDates= []; 

     for (var i = 1; i <= 7; i++) { 
      weekDates.push(moment().day(i)); 
     } 

     return weekDates; 
    } 

    var thisWeekDates = getThisWeekDates(); 

    thisWeekDates.forEach(function(date){ console.log(date.format());}); 

以下結果到控制檯上面打印的代碼:

2017-03-20T21:26:27+01:00 
2017-03-21T21:26:27+01:00 
2017-03-22T21:26:27+01:00 
2017-03-23T21:26:27+01:00 
2017-03-24T21:26:27+01:00 
2017-03-25T21:26:27+01:00 
2017-03-26T21:26:27+02:00 
+0

爲什麼鏈接plunkr時,你可以使用SO的[內置片段功能(https://stackoverflow.blog/2014/09/16/introducing-runnable- JavaScript的CSS和HTML的代碼-片段/)? –

2

我會用你的2017年2月27日的例子跟蹤代碼:

first = 27 - 1 + 1 = 27 

loop: 

Feb.setDate(27) = 27 feb 
Feb.setDate(28) = 28 feb 
Feb.setDate(29) = Not 29 days in Feb. So it sets current to 29-28 = 1st day of March 
March.setDate(30) = March 30 
March.setDate(31) = March 31  
March.setDate(32) = Not 32 days in March. So it sets current to 31-32 = 1st of April.. 
April.setDate(33) = Not 33 days in April. So it sets current day 33-30 = 3rd day of May. 

請注意我用速記Month.setDate()顯示Date對象在被調用時的月份。

所以問題在於你對當前正在使用的setDate的理解。它會更改月份,如果您使用的值不是當月的某一天,則會適當調整月份和日期。我希望這能爲你解決問題。

有關如何將日期添加到日期的信息,請參閱Add +1 to current date。適應你的代碼,你可以設置當前到一週的第一天,然後就不斷增加1天,並推動複製到陣列:

function days(current) { 
 
    var week = []; 
 
    // Starting Monday not Sunday 
 
    var first = current.getDate() - current.getDay() + 1; 
 
    current.setDate(first); 
 
    for (var i = 0; i < 7; i++) { 
 
    week.push(new Date(+current)); 
 
    current.setDate(current.getDate()+1); 
 
    } 
 
    return week; 
 
} 
 

 
var input = new Date(2017, 1, 27); 
 
console.log('input: %s', input); 
 

 
var result = days(input); 
 
console.log(result.map(d => d.toString()));

注意這改變日期通過(每個原始代碼),你可能想要當前副本,以避免這一點。

+0

這是一個很好的解釋爲什麼代碼不工作,但OP問如何解決它。 –

+0

@Jordan好吧,他問有沒有人知道發生了什麼,以及如何解決這個問題。我想我只是部分回答。只是想幫助:) – jakeehoffmann

+0

@jakeehoffmann,我讚賞你的解釋和你的額外內容。我希望我能標出兩個答案。 – John