2011-09-28 57 views

Trả lời

0

Không, không có chức năng này . Bạn phải làm điều đó bằng tay. Theo dõi this way.

+0

Tìm thấy thứ gì đó [thêm] (http://stackoverflow.com/questions/7078730/how-to-convert-number-of-week-into-date) về chủ đề. – PiTheNumber

1

Hãy xem at this fiddle. Đầu tiên, nó sẽ là tuần đầu tiên của năm được chỉ định. Điều này đưa vào tài khoản theo ISO 8601 tuần đầu tiên của năm là tuần đầu tiên có ngày thứ tư. Sau đó, nó thêm các tuần vào ngày mua lại và trả về kết quả.

function firstDayOfWeek(week, year) { 

    var date  = firstWeekOfYear(year), 
     weekTime = weeksToMilliseconds(week), 
     targetTime = weekTime + date.getTime(); 

    return date.setTime(targetTime); 

} 
+1

Dấu chấm có hoạt động không. Ví dụ, 'new Date (firstDayOfWeek (1,2013))' cho 'Tue Jan 1, 2013' trong khi ngày đầu tiên của tuần đầu tiên của năm 2013 là' Mon Dec 31, 2012'. Xem http://www.epochconverter.com/date-and-time/weeknumbers-by-year.php –

+0

Phải, tôi đã giả định sai rằng đó là điều mà raimonbosch muốn, bởi vì ví dụ đầu tiên ngụ ý điều này. Tôi đã không kiểm tra xem nó thực sự là một thứ hai. :) Như bạn đã cung cấp một câu trả lời tốt hơn cho mình, tôi sẽ upvote của bạn. –

0

Tôi lấy ý tưởng ban đầu từ Kevin, với một số chỉnh sửa, coz mã gốc sẽ trả về mili giây. Ở đây bạn đi:

var d = firstDayOfWeek(9, 2013); 

console.log(d.format("yyyy-MM-dd")); 

////////////////////////////// Main Code ////////////////////////////// 
function firstDayOfWeek(week, year) { 

    if (typeof year !== 'undefined') { 
     year = (new Date()).getFullYear(); 
    } 

    var date  = firstWeekOfYear(year), 
     weekTime = weeksToMilliseconds(week), 
     targetTime = date.getTime() + weekTime - 86400000; 

    var result = new Date(targetTime) 

    return result; 
} 

function weeksToMilliseconds(weeks) { 
    return 1000 * 60 * 60 * 24 * 7 * (weeks - 1); 
} 

function firstWeekOfYear(year) { 
    var date = new Date(); 
    date = firstDayOfYear(date,year); 
    date = firstWeekday(date); 
    return date; 
} 

function firstDayOfYear(date, year) { 
    date.setYear(year); 
    date.setDate(1); 
    date.setMonth(0); 
    date.setHours(0); 
    date.setMinutes(0); 
    date.setSeconds(0); 
    date.setMilliseconds(0); 
    return date; 
} 

function firstWeekday(date) { 

    var day = date.getDay(), 
     day = (day === 0) ? 7 : day; 

    if (day > 3) { 

     var remaining = 8 - day, 
      target = remaining + 1; 

     date.setDate(target); 
    } 

    return date; 
} 
+0

Theo như tôi đã hiểu, bạn muốn lấy ngày tháng là 'Ngày' và không phải là giá trị dài bằng mili giây. Nhưng tại sao bạn đã trừ 86400000 thành targetTime? –

10

Như đang Kevin không thực hiện theo tiêu chuẩn ISO 8601 đúng cách (ngày đầu tiên của tuần đầu tiên của năm phải là một thứ Hai), tôi đã sửa nó và kết thúc với (cũng check it on jsfiddle):

function firstDayOfWeek(week, year) { 

    if (year==null) { 
     year = (new Date()).getFullYear(); 
    } 

    var date  = firstWeekOfYear(year), 
     weekTime = weeksToMilliseconds(week), 
     targetTime = date.getTime() + weekTime; 

    return date.setTime(targetTime); 

} 

function weeksToMilliseconds(weeks) { 
    return 1000 * 60 * 60 * 24 * 7 * (weeks - 1); 
} 

function firstWeekOfYear(year) { 
    var date = new Date(); 
    date = firstDayOfYear(date,year); 
    date = firstWeekday(date); 
    return date; 
} 

function firstDayOfYear(date, year) { 
    date.setYear(year); 
    date.setDate(1); 
    date.setMonth(0); 
    date.setHours(0); 
    date.setMinutes(0); 
    date.setSeconds(0); 
    date.setMilliseconds(0); 
    return date; 
} 

/** 
* Sets the given date as the first day of week of the first week of year. 
*/ 
function firstWeekday(firstOfJanuaryDate) { 
    // 0 correspond au dimanche et 6 correspond au samedi. 
    var FIRST_DAY_OF_WEEK = 1; // Monday, according to iso8601 
    var WEEK_LENGTH = 7; // 7 days per week 
    var day = firstOfJanuaryDate.getDay(); 
    day = (day === 0) ? 7 : day; // make the days monday-sunday equals to 1-7 instead of 0-6 
    var dayOffset=-day+FIRST_DAY_OF_WEEK; // dayOffset will correct the date in order to get a Monday 
    if (WEEK_LENGTH-day+1<4) { 
     // the current week has not the minimum 4 days required by iso 8601 => add one week 
     dayOffset += WEEK_LENGTH; 
    } 
    return new Date(firstOfJanuaryDate.getTime()+dayOffset*24*60*60*1000); 
} 

function assertDateEquals(effectiveDate, expectedDate, description) { 
    if ((effectiveDate==null^expectedDate==null) || effectiveDate.getTime()!=expectedDate.getTime()) { 
     console.log("assert failed: "+description+"; effective="+effectiveDate+", expected="+expectedDate); 
    } 
} 
function assertEquals(effectiveValue, expectedValue, description) { 
    if (effectiveValue!=expectedValue) { 
     console.log("assert failed: "+description+"; effective="+effectiveValue+", expected="+expectedValue); 
    } 
} 

// expect the first day of year to be a monday 
for (var i=1970; i<2050; i++) { 
    assertEquals(firstWeekOfYear(i).getDay(), 1, "first day of year "+i+" must be a monday"); // 1=Monday 
} 

// assert some future first day of first week of year; source: http://www.epochconverter.com/date-and-time/weeknumbers-by-year.php 
assertDateEquals(firstWeekOfYear(2013), new Date(Date.parse("Dec 31, 2012")), "2013"); 
assertDateEquals(firstWeekOfYear(2014), new Date(Date.parse("Dec 30, 2013")), "2014"); 
assertDateEquals(firstWeekOfYear(2015), new Date(Date.parse("Dec 29, 2014")), "2015"); 
assertDateEquals(firstWeekOfYear(2016), new Date(Date.parse("Jan 4, 2016")), "2016"); 
assertDateEquals(firstWeekOfYear(2017), new Date(Date.parse("Jan 2, 2017")), "2017"); 
assertDateEquals(firstWeekOfYear(2018), new Date(Date.parse("Jan 1, 2018")), "2018"); 
assertDateEquals(firstWeekOfYear(2019), new Date(Date.parse("Dec 31, 2018")), "2019"); 
assertDateEquals(firstWeekOfYear(2020), new Date(Date.parse("Dec 30, 2019")), "2020"); 
assertDateEquals(firstWeekOfYear(2021), new Date(Date.parse("Jan 4, 2021")), "2021"); 
assertDateEquals(firstWeekOfYear(2022), new Date(Date.parse("Jan 3, 2022")), "2022"); 
assertDateEquals(firstWeekOfYear(2023), new Date(Date.parse("Jan 2, 2023")), "2023"); 
assertDateEquals(firstWeekOfYear(2024), new Date(Date.parse("Jan 1, 2024")), "2024"); 
assertDateEquals(firstWeekOfYear(2025), new Date(Date.parse("Dec 30, 2024")), "2025"); 
assertDateEquals(firstWeekOfYear(2026), new Date(Date.parse("Dec 29, 2025")), "2026"); 

console.log("All assertions done."); 

tôi bao gồm trường hợp kiểm tra đối với một số ngày để kiểm tra xem ngày đầu tiên của tuần đầu tiên của năm là một thứ hai và kiểm tra một vài cuộc hẹn dựa trên http://www.epochconverter.com/date-and-time/weeknumbers-by-year.php

9

Ai đó có thể vẫn còn quan tâm đến một phiên bản chứa hơn:

function firstDayOfWeek (year, week) { 

    // Jan 1 of 'year' 
    var d = new Date(year, 0, 1), 
     offset = d.getTimezoneOffset(); 

    // ISO: week 1 is the one with the year's first Thursday 
    // so nearest Thursday: current date + 4 - current day number 
    // Sunday is converted from 0 to 7 
    d.setDate(d.getDate() + 4 - (d.getDay() || 7)); 

    // 7 days * (week - overlapping first week) 
    d.setTime(d.getTime() + 7 * 24 * 60 * 60 * 1000 
     * (week + (year == d.getFullYear() ? -1 : 0))); 

    // daylight savings fix 
    d.setTime(d.getTime() 
     + (d.getTimezoneOffset() - offset) * 60 * 1000); 

    // back to Monday (from Thursday) 
    d.setDate(d.getDate() - 3); 

    return d; 
} 
+0

Không hoạt động. 'firstDayOfWeek (2015, 37)' => '2015-09-06', phải là' 2015-09-07'. – rgtk

Các vấn đề liên quan