2014-04-10 56 views
2

我寫了兩個簡單的函數來玩弄Moment.js。帶Moment.js的簡單函數給出了意想不到的結果(?)

第一個函數返回一個星期作爲一個日期數組,給定該星期的一個任意一天。

var getWeek = function (day) { 
    var today = day.clone(); 
    var monday = today.clone().startOf('isoWeek'); 
    var sunday = today.clone().endOf('isoWeek'); 
    var days = []; 
    for (var current = monday.clone(); current.isBefore(today, 'day'); 
      current.add(1, 'days')) { 
     days.push(current.format()); 
    } 

    days.push(today.format()); 

    for (var current = today.clone().add(1, 'days'); 
     current.isBefore(sunday, 'day') || 
     (current.isSame(sunday, 'day') &&!today.isSame(sunday, 'day')); 
     current.add(1, 'days')) { 
     days.push(current.format()); 
    } 

    return days; 
}; 

第二個函數返回給定任意一天的一年中的星期數。

var dayofweek = function (day) { 
    return Math.ceil(moment(day).dayOfYear()/7); 
}; 

然而,當我今天通過爲moment()我得到正確的結果測試,15 當我通過傳遞getWeek(moment())[0](這是星期一),我得到14

JSFiddle

測試

我懷疑這與時區或類似的東西有關,但我幾乎不知道這些東西是如何工作的。有人能弄明白嗎?

回答

1

您的計算週數的算法不正確。 (也叫dayofweek有點混亂)。

您需要使用

floor((dayOfYear(date) - dayOfWeek(date) + 10)/7); 

dayOfYear回報1-366和dayOfWeek回報1-7(週一至週日)。

但是,既然您已經使用了moment.js,爲什麼不使用.isoWeek()

Updated JSFiddle

來源:ISO Week Date (Wikipedia)

+0

我想通了,我也可以使用'.isoWeekday(號碼)'得到日的一週中,連同'.isoWeek()'。 Moment.js是一個偉大的圖書館,但文檔有點混亂。謝謝! – link

相關問題