2011-09-28 7 views

risposta

0

No, non esiste una funzione per questo . Devi farlo a mano. Segui this way.

+0

Trovato qualcosa [altro] (http://stackoverflow.com/questions/7078730/how-to-convert-number-of-week-into-date) sull'argomento. – PiTheNumber

1

Dai uno sguardo allo at this fiddle. Innanzitutto, ottiene la prima settimana dell'anno specificato. Ciò tiene conto del fatto che, secondo lo ISO 8601, la prima settimana dell'anno è la prima settimana che contiene un mercoledì. Quindi aggiunge le settimane alla data acquisita e restituisce il risultato.

function firstDayOfWeek(week, year) { 

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

    return date.setTime(targetTime); 

} 
+1

Il punto funziona. Ad esempio, 'new Date (firstDayOfWeek (1.2013))' restituisce 'Tue Jan 1, 2013' mentre il primo giorno della prima settimana del 2013 è' Mon Dec 31, 2012'. Vedi http://www.epochconverter.com/date-and-time/weeknumbers-by-year.php –

+0

Giusto, ho assunto erroneamente che fosse ciò che voleva il raimonbosch, perché il primo esempio implicava questo. Non ho controllato che sia davvero un lunedì. :) Dato che hai già fornito una risposta migliore da te stesso, inviterò il tuo. –

0

ho preso l'idea originale da Kevin, con alcune modifiche, coz il codice originale sta tornando millisecondi. Qui si va:

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

Per quanto ho capito, volevi ottenere la data come 'Date' e non come un valore lungo in millisecondi. Ma perché hai sottratto 86400000 a targetTime? –

10

come codice di Kevin non implementa ISO 8601 correttamente (primo giorno della prima settimana dell'anno deve essere un Lunedi), ho corretto e finito con (anche 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."); 

ho incluso casi di test per alcune date per verificare che il primo giorno della prima settimana dell'anno è un Lunedi e controllato alcune date basate su http://www.epochconverter.com/date-and-time/weeknumbers-by-year.php

9

qualcuno potrebbe essere ancora interessato a una versione più contenuta:

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

Non funziona. 'firstDayOfWeek (2015, 37)' => '2015-09-06', dovrebbe essere' 2015-09-07'. – rgtk

Problemi correlati