2012-12-06 107 views
-3

我怎樣才能得到一個星期使用JavaScript一個月的日子?在JavaScript中顯示一個月的一個星期數字的日期?

例如:

週數,月份和年份將由用戶給出。

可以說是2週數,12個月和2012年。

現在我想所得日期爲3,4,5,6,7,8,9

在此先感謝。

+1

*「我怎樣才能得到...」*希望你會開始寫一些代碼。 –

+1

在JavaScript中處理日期時,通常使用庫來爲您做一些辛苦的工作 - 例如Moment.js:http://momentjs.com/對於您的場景,您可以從以下版本開始:創造你想要的一年的開始。然後添加對應於您想要的星期的週數。然後,您可以循環設置每週的星期幾(Sun,Mon等),並在循環過程中將每週的每一天的日期緩存到列表中。 –

+1

你對「週數」的定義是什麼?我會說,12月的第二週從8號開始...... – nnnnnn

回答

1

當在JavaScript中日期的工作,它通常是得心應手地使用圖書館做一些艱難的工作適合你 - 例如Moment.js:http://momentjs.com/

隨着moment.js,爲您的方案中,您可以通過啓動創造你想要的一年的開始。然後添加對應於您想要的星期的週數。然後,您可以循環設置每週的星期幾(Sun,Mon等),並在循環過程中將每週的每一天的日期緩存到列表中。

E.g:

var datesOfWeek = []; 
var workingDate = moment(new Date(year, 1, 1)); 
workingDate.add('weeks', week); 
for(var dayOfWeek = 0; dayOfWeek < 7; dayOfWeek++) { 
    workingDate.day(dayOfWeek); 
    datesOfWeek.push(workingDate.toDate()); 
} 
0

既然你已經決定重新定義一個星期的開始,你來了更嚴厲的,但既然你問這個問題,我很好奇弄明白。以下是我想出了:

http://jsfiddle.net/BtR3u/1/

function getDatesByWeekNumber(year, month, weekNum, firstWeekDay) { 
    var ret = []; 

    firstWeekDay = firstWeekDay || 0; 
    var lastWeekDay = 7 + firstWeekDay; 

    var tempDate = new Date(year, month, 1); 
    console.log("tempDate: " + tempDate); 

    var daysInThisMonth = daysInMonth(year, month); 
    console.log("daysInThisMonth : " + daysInThisMonth); 

    console.log("lastWeekDay: " + (7 + firstWeekDay)); 

    // Finds the first day of the week looking for 
    var curMonth = tempDate.getMonth(); 
    var curYear = tempDate.getFullYear(); 
    var weekCounter = 0; 
    while (weekCounter < weekNum-1 && (curMonth === month && curYear === year)) { 
     var dayCounter = 0; 
     var dayPerWeekCounter = tempDate.getDay(); 

     // No more than 7 days  No more than virtual last day     Same month/year 
     while ((dayCounter < 7) && (dayPerWeekCounter < lastWeekDay) && (curMonth === month && curYear === year)) { 
      tempDate.setDate(tempDate.getDate() + 1); 
      dayPerWeekCounter++; 
      dayCounter++; 
      curMonth = tempDate.getMonth(); 
      curYear = tempDate.getFullYear(); 
     } 

     curMonth = tempDate.getMonth(); 
     curYear = tempDate.getFullYear(); 
    } 

    console.log("First day of found week: " + tempDate); 

    if (tempDate.getMonth() === month && tempDate.getFullYear() === year) { 
     // Finds each day in week specified that doesn't go out of bounds 
     var dayCounter = 0; 
     var dayPerWeekCounter = tempDate.getDay(); 
     var dayPerMonthCounter = tempDate.getDate(); 
     // No more than 7 days  No more than virtual last day   Not past end of month 
     while ((dayCounter < 7) && (dayPerWeekCounter < lastWeekDay) && (dayPerMonthCounter <= daysInThisMonth)) { 
      var cur = tempDate.getDate(); 
      ret.push(cur); 
      tempDate.setDate(cur + 1); 
      dayCounter++; 
      dayPerWeekCounter++; 
      dayPerMonthCounter++; 
     } 
    } 

    return ret; 
} 

function copyDate(orig) { 
    return new Date(orig.getTime()); 
} 

function daysInMonth(year, month) { 
    return new Date(year, month+1, 0).getDate(); 
} 

var the_dates = getDatesByWeekNumber(2012, 11, 2, 1); 
console.log("########FINAL ANSWER: " + JSON.stringify(the_dates)); 

我敢肯定有一個更好的方式做我做什麼,所以不要對我大喊大叫。試圖弄清楚這個問題,我的腦子已經夠炸了。對不起,如果變量名稱很奇怪 - 有很多i,jk,所以我認爲最好不要使用它們......也許它會。我盡我所能測試了很多場景,但我找不到任何不能工作的地方,但我確信有些事情會出錯。

有幾件事情需要注意:

我決定遵循的Javascript Date約定 - 個月從0開始,0周開學的日子,與1月份開始的日子所以,如果你想要月,你傳遞在11.

就像我說的,你已經重新定義了一週的開始,所以我通過使用第四個參數(從0開始)進行了定製。例如,如果星期一是一週中的第一天(就像它似乎與您一樣),您可以使用1。它是可選的,如果您忽略它或將其傳遞給錯誤值,則默認爲0

第三個參數是您正在查找的月份的星期數(從1開始)。例如,如果你正在尋找第三週,你會使用3

它有「安全」檢查,以確保它不會返回月份以外的天數(如果您查看的那一週類似於「28,29,30,31 ... 1,2 ,3「 - 它不會抓住最後3個。此外,它似乎適用於本月初(如本月)的情況,第一天是在本週中旬,而您想要第一週。

所以它會返回的最多的項目是7(一個完整的,有效的一週)。但很少有可能返回。

相關問題