2011-09-28 11 views

Respuesta

0

No, no hay ninguna función para este . Tienes que hacerlo a mano. Siga this way.

+0

Encontré algo [más] (http://stackoverflow.com/questions/7078730/how-to-convert-number-of-week-into-date) sobre el tema. – PiTheNumber

1

Echa un vistazo a at this fiddle. Primero, llega la primera semana del año especificado. Esto toma en cuenta que según ISO 8601 la primera semana del año es la primera semana que contiene un miércoles. Luego agrega las semanas a la fecha adquirida y devuelve el resultado.

function firstDayOfWeek(week, year) { 

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

    return date.setTime(targetTime); 

} 
+1

Does dot work. Por ejemplo, 'new Date (firstDayOfWeek (1,2013))' gives 'Tue Jan 1, 2013' mientras que el primer día de la primera semana de 2013 es' lunes 31 de diciembre de 2012'. Ver http://www.epochconverter.com/date-and-time/weeknumbers-by-year.php –

+0

Correcto, asumí erróneamente que eso era lo que quería el raimonbosch, porque el primer ejemplo implicaba esto. No compruebo que sea realmente un lunes. :) Como usted ya proporcionó una mejor respuesta usted mismo, voy a votar el suyo. –

0

Tomé la idea original de Kevin, con algunos ajustes, coz el código original está volviendo milisegundos. Aquí van:

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

Por lo que yo entendí, quería obtener la fecha como 'Fecha' y no como un valor largo en milisegundos. ¿Pero por qué restaste 86400000 a targetTime? –

10

Como código de Kevin no implementa la norma ISO 8601 correctamente (primer día de la primera semana del año debe ser un lunes), he corregido y terminó con (también 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."); 

que incluyen casos de prueba para algunas fechas para comprobar que el primer día de la primera semana del año es un lunes y comprobado algunas fechas en base a http://www.epochconverter.com/date-and-time/weeknumbers-by-year.php

9

alguien podría estar todavía está interesado en una versión más contenida:

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

No funciona. 'firstDayOfWeek (2015, 37)' => '2015-09-06', debe ser' 2015-09-07'. – rgtk

Cuestiones relacionadas