2014-02-12 228 views
11

我正在使用Moment.js,它很棒。我現在面臨的問題是,我無法弄清楚如何獲得特定日期的月份周。我只能在Moment js文檔中找到「每週的一週」。例如,如果我選擇今天的日期(2014年12月2日),我想知道這個日期是在二月份的第二個星期,因此它是本月的第二個星期三。有任何想法嗎?編輯: 我想一些澄清是必要的。我最需要的是一個月中某一天的第n個號碼。例如,(從評論中)2014年2月1日將是本月的第一個星期六。 2014年2月3日將是本月的第一個星期一,即使它在本月的第二週「技術上」。基本上,谷歌日曆的重複函數如何分類日期。Moment.js如何獲取每月的星期? (谷歌日曆風格)

+1

你想如何定義行爲? 2014年2月1日是星期六。是在2月3日的第一個星期,還是第二個? – matthewk

+0

2014年2月1日,我會考慮本月的第一個星期六。對於2014年2月3日,我會考慮這個月的第一個星期一。基本上,谷歌日曆如何分類。 – train

回答

22

看起來,moment.js沒有實現您正在尋找的功能的方法。 然而,你可以找到周在一個月的某一天的第n個號碼使用Math.ceildate/7 例如:

var firstFeb2014 = moment("2014-02-01"); //saturday 
var day = firstFeb2014.day(); //6 = saturday 
var nthOfMoth = Math.ceil(firstFeb2014.date()/7); //1 

var eightFeb2014 = moment("2014-02-08"); //saturday, the next one 
console.log(Math.ceil(eightFeb2014.date()/7)); //prints 2, as expected 

它看起來這是你正在尋找的數量,通過下述試驗證實

function test(mJsDate){ 
    var str = mJsDate.toLocaleString().substring(0, 3) + 
      " number " + Math.ceil(mJsDate.date()/7) + 
      " of the month"; 
    return str; 
} 

for(var i = 1; i <= 31; i++) { 
    var dayStr = "2014-01-"+ i; 
    console.log(dayStr + " " + test(moment(dayStr))); 
} 

//examples from the console: 
//2014-01-8 Wed number 2 of the month 
//2014-01-13 Mon number 2 of the month 
//2014-01-20 Mon number 3 of the month 
//2014-01-27 Mon number 4 of the month 
//2014-01-29 Wed number 5 of the month 
+0

一個班輪!太棒了。 (測試和工作) – train

+1

什麼是'x.date()'? – skube

+0

'''date'''方法返回月份的一天。 –

0

約像什麼:

weekOfCurrentMonth = (moment().week() - (moment().month()*4)); 

這需要一年的當前周,並通過4倍減去它前面的月數。這應該給你一週的當月

+1

我已經考慮過這些問題,但問題是不是每個月都有4周。例如,上個月,2014年1月,「技術上」有5周。 – train

+1

@train除非你只計算整個星期,在這種情況下它有3!不幸的是,你必須選擇一個定義,根據該定義,每個星期將「屬於」一個特定的月份,並且沒有一個同意的正確方法來執行此操作。 –

1
function countWeekdayOccurrencesInMonth(date) { 

    var m = moment(date), 
      weekDay = m.day(), 
      yearDay = m.dayOfYear(), 
      count = 0; 

    m.startOf('month'); 
    while (m.dayOfYear() <= yearDay) { 
     if (m.day() == weekDay) { 
      count++; 
     } 
     m.add('days', 1); 
    } 

    return count; 
} 
+0

您的答案和Giovanni的作品完全符合我的需求。謝謝! – train

+1

雖然我的努力而不是聰明! :) –

4

簡單使用moment.js

 
function week_of_month(date) { 

     prefixes = [1,2,3,4,5]; 

    return prefixes[0 | moment(date).date()/7] 

} 
+0

爲什麼不使用'date.getDate()'而不是'moment(date).date()',moreso'2017-07-27'返回錯誤的一週 – JohnTheBeloved

1

沒有與@Daniel一個問題Earwicker的答案。 我是用我自己的應用功能和while循環是由於以下情況無窮:

我試圖找出哪些十二月(2016)的一週是第31天 月的第一天當年的第336天。十二月的最後一天是一年中的第366天。

問題在於:當它是第366天(12月31日,一年中的最後一天)時,代碼在此日期中又增加了一天。但在另一天添加它將是2017年1月1日。因此,循環從未結束。

while (m.dayOfYear() <= yearDay) { 

    if (m.day() == weekDay) { 
     count++; 
    } 
    m.add('days', 1); 
} 

我加了以下幾行代碼以使這個問題將被固定:

function countWeekdayOccurrencesInMonth(date) { 

    var m = moment(date), 
     weekDay = m.day(), 
     yearDay = m.dayOfYear(), 
     year = m.year(), 
     count = 0; 

m.startOf('month'); 

while (m.dayOfYear() <= yearDay && m.year() == year) { 
    if (m.day() == weekDay) { 
     count++; 
    } 
    m.add('days', 1); 
} 

return count; 
} 

它驗證是否仍然在日期的同一年被veryfied

1

當根據給定日期計算月份的星期時,您必須採取fset考慮到。並非所有月份都是在一週的第一天開始。

如果你想考慮這個偏移量,你可以使用類似下面的東西,如果你正在使用的時刻。

function weekOfMonth (input = moment()) { 
    const firstDayOfMonth = input.clone().startOf('month'); 
    const firstDayOfWeek = firstDayOfMonth.clone().startOf('week'); 

    const offset = firstDayOfMonth.diff(firstDayOfWeek, 'days'); 

    return Math.ceil((input.date() + offset)/7); 
} 
+1

雖然這不能解決OP問題,但它解決了我的問題 - 我需要查看本月的周,就像查看日曆一樣,即星期一 - >星期日,第一個「星期」可能包含前一個月的日期,謝謝 –