2011-09-28 27 views

答えて

0

ありません、このための機能がありません。あなたは手でそれをする必要があります。 this wayに従ってください。

+0

トピックに関する[more](http://stackoverflow.com/questions/7078730/how-to-convert-number-of-week-into-date)が見つかりました。 – PiTheNumber

1

at this fiddleをご覧ください。まず、指定された年の最初の週を取得します。これは、ISO 8601によれば、その年の第1週は水曜日を含む第1週であることを考慮に入れている。次に、取得した日付に週を追加し、結果を返します。

function firstDayOfWeek(week, year) { 

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

    return date.setTime(targetTime); 

} 
+1

ドットは機能しますか?例えば、 'new Date(firstDayOfWeek(1,2013))'は、2013年1月1日の最初の日が '2012年12月31日 'の間、' Tue Jan 1、2013'を返します。 http://www.epochconverter.com/date-and-time/weeknumbers-by-year.php –

+0

を参照してください。最初の例がこれを暗示していたので、私は間違ってraimonボッシュが望んでいたと仮定しました。私はそれが本当に月曜日であることを確認しなかった。 :)あなたはすでに自分自身でより良い答えを提供しているので、私はあなたのアップアップします。 –

0

元のコードは、ミリ秒を返すだって私は、いくつかの調整で、Kevinからオリジナルのアイデアを取りました。ここに行く:

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

私が理解している限り、あなたはミリ秒単位での長い値ではなく、「日付」として日付を取得したいと考えました。しかし、なぜあなたはtargetTimeに86400000を差し引いたのですか? –

10

ケビンのコードは、(年の最初の週の最初の日は月曜日でなければならない)適切にISO 8601を実装していませんので、私はそれを修正して(も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."); 

私は年の最初の週の最初の日は月曜日であることを確認するために、いくつかの日付のためのテストケースを含めると、誰かがより一層含まれるバージョンに興味があるかもしれませんhttp://www.epochconverter.com/date-and-time/weeknumbers-by-year.php

9

に基づいていくつかの日付を確認:

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

動作しません。 'firstDayOfWeek(2015,37)' => '2015-09-06'は' 2015-09-07'でなければなりません。 – rgtk

関連する問題