Obtenga la semana del año en JavaScript como en PHP

140

¿Cómo obtengo el número de semana actual del año, como PHP date('W')?

Debe ser el número de semana ISO-8601 del año, semanas que comienzan el lunes.

PeeHaa
fuente
1
Mire <a href=" javascript.about.com/library/blweekyear.htm "> <b> aquí </b> </a>, que fue el primer enlace dado cuando busqué en Google 'javascript week of year'.
Pete Wilson
+1 Lol! Ahí es donde obtuve el fragmento de mí mismo, pero no podía recordar la fuente como lo obtuve hace un tiempo.
Tom Chantler
@Pete: Ese código obtiene 22 como la semana actual. Aunque debería ser 21
PeeHaa
@Pete:: D Nopez un simple -1 no funcionará: P Eso no obtendría el número de semana ISO-8601. Una semana en ISO-8601 comienza el lunes. La primera semana es la semana con el primer jueves del año. en.wikipedia.org/wiki/ISO-8601 . PD: No fui yo quien te rechazó.
PeeHaa

Respuestas:

276

Debería poder obtener lo que desea aquí: http://www.merlyn.demon.co.uk/js-date6.htm#YWD .

Un mejor enlace en el mismo sitio es: Trabajar con semanas .

Editar

Aquí hay algo de código basado en los enlaces proporcionados y ese anuncio publicado por Dommer. Se ha probado ligeramente con los resultados en http://www.merlyn.demon.co.uk/js-date6.htm#YWD . Por favor, pruebe a fondo, no se ofrece garantía.

Editar 2017

Hubo un problema con las fechas durante el período en que se observó el horario de verano y los años en que el 1 de enero era el viernes. Solucionado mediante el uso de todos los métodos UTC. Lo siguiente devuelve resultados idénticos a Moment.js.

/* For a given date, get the ISO week number
 *
 * Based on information at:
 *
 *    http://www.merlyn.demon.co.uk/weekcalc.htm#WNR
 *
 * Algorithm is to find nearest thursday, it's year
 * is the year of the week number. Then get weeks
 * between that date and the first day of that year.
 *
 * Note that dates in one year can be weeks of previous
 * or next year, overlap is up to 3 days.
 *
 * e.g. 2014/12/29 is Monday in week  1 of 2015
 *      2012/1/1   is Sunday in week 52 of 2011
 */
function getWeekNumber(d) {
    // Copy date so don't modify original
    d = new Date(Date.UTC(d.getFullYear(), d.getMonth(), d.getDate()));
    // Set to nearest Thursday: current date + 4 - current day number
    // Make Sunday's day number 7
    d.setUTCDate(d.getUTCDate() + 4 - (d.getUTCDay()||7));
    // Get first day of year
    var yearStart = new Date(Date.UTC(d.getUTCFullYear(),0,1));
    // Calculate full weeks to nearest Thursday
    var weekNo = Math.ceil(( ( (d - yearStart) / 86400000) + 1)/7);
    // Return array of year and week number
    return [d.getUTCFullYear(), weekNo];
}

var result = getWeekNumber(new Date());
document.write('It\'s currently week ' + result[1] + ' of ' + result[0]);

Las horas se ponen a cero al crear la fecha "UTC".

Versión de prototipo minimizada (solo devuelve el número de semana):

Date.prototype.getWeekNumber = function(){
  var d = new Date(Date.UTC(this.getFullYear(), this.getMonth(), this.getDate()));
  var dayNum = d.getUTCDay() || 7;
  d.setUTCDate(d.getUTCDate() + 4 - dayNum);
  var yearStart = new Date(Date.UTC(d.getUTCFullYear(),0,1));
  return Math.ceil((((d - yearStart) / 86400000) + 1)/7)
};

document.write('The current ISO week number is ' + new Date().getWeekNumber());

Sección de prueba

En esta sección, puede ingresar cualquier fecha en formato AAAA-MM-DD y verificar que este código proporcione el mismo número de semana que el número de semana ISO de Moment.js (probado durante 50 años de 2000 a 2050).

Date.prototype.getWeekNumber = function(){
  var d = new Date(Date.UTC(this.getFullYear(), this.getMonth(), this.getDate()));
  var dayNum = d.getUTCDay() || 7;
  d.setUTCDate(d.getUTCDate() + 4 - dayNum);
  var yearStart = new Date(Date.UTC(d.getUTCFullYear(),0,1));
  return Math.ceil((((d - yearStart) / 86400000) + 1)/7)
};

function checkWeek() {
  var s = document.getElementById('dString').value;
  var m = moment(s, 'YYYY-MM-DD');
  document.getElementById('momentWeek').value = m.format('W');
  document.getElementById('answerWeek').value = m.toDate().getWeekNumber();      
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script>

Enter date  YYYY-MM-DD: <input id="dString" value="2021-02-22">
<button onclick="checkWeek(this)">Check week number</button><br>
Moment: <input id="momentWeek" readonly><br>
Answer: <input id="answerWeek" readonly>

RobG
fuente
8
Este código calcula el 2 de enero de 2011 como la 53ª semana de 2010, donde debería ser la 52ª. Esto funciona correctamente en el código original pero no en su adaptación.
Alasdair
44
Me salvaste el culo. Gracias. Si desea contribuir a Open Source, le sugiero que cree un parche para el método jQuery UI: $ .datepicker.iso8601Week (fecha) ya que solo devuelve weekNo, pero no year.
Christian
18
Hoy, 4 de enero de 2016, noté que era necesario agregar d.setMilliseconds(0)también: seguía mostrando diferentes números de semana para la misma fecha, dependiendo de si usaba una nueva Fecha () o una nueva Fecha ("1/4/2016"). Solo un aviso para otros que podrían experimentar lo mismo.
Jacob Lauritzen
2
El código provisto no sigue ISO 8601, está desactivado por uno
Eric Grange
2
Vaya, tienes razón, mi error tipográfico, se suponía que era '2015-12-30', lo que funciona.
Ally
26

Como se dijo anteriormente pero sin una clase:

let now = new Date();
let onejan = new Date(now.getFullYear(), 0, 1);
week = Math.ceil( (((now - onejan) / 86400000) + onejan.getDay() + 1) / 7 );
nvd
fuente
44
one-ene-tang! * ninja-roll *
CodeManX
2
Esta es la única respuesta que obtiene el número de semana correcto incluso para la primera semana de un año.
PrasadW
Nota para (now.getTime() - onejan.getTime())evitar problemas de compilación.
Swoox
44
La pregunta solicitó ISO 8601 que esto ignora. Como respuesta a la pregunta, simplemente está mal
havlock
23

Accordily http://javascript.about.com/library/blweekyear.htm

Date.prototype.getWeek = function() {
    var onejan = new Date(this.getFullYear(),0,1);
    var millisecsInDay = 86400000;
    return Math.ceil((((this - onejan) /millisecsInDay) + onejan.getDay()+1)/7);
};
orafaelreis
fuente
1
Conciso, pero trata el domingo como el primer día de la semana, por lo que el domingo 27 de diciembre de 2015 es el primer día de la semana 53 en lugar del último día de la semana 52. Sin embargo, eso puede ser adecuado para algunos.
RobG
3
Creo que dado que esto se está agregando al prototipo, es lo que esperarías ya que Date trata el domingo como el primer día.
Ed Sykes
¿Esto no tendrá problemas en los días de horario de verano? Creo que no avanzará hasta la 1 de la madrugada durante el verano.
Hafthor
Además, ¿no técnicamente esto no avanza la semana hasta las 0: 00: 00.001? ¿Mejor usar Math.floor?
Hafthor
11

La Date.format()biblioteca de Jacob Wright implementa el formato de fecha al estilo de la date()función de PHP y admite el número de semana ISO-8601:

new Date().format('W');

Puede ser un poco excesivo para solo un número de semana, pero admite el formato de estilo PHP y es bastante útil si va a hacer mucho de esto.

Brad Koch
fuente
Buena solución para scripts rápidos pirateados juntos :)
Steen Schütt
6
getWeekOfYear: function(date) {
        var target = new Date(date.valueOf()),
            dayNumber = (date.getUTCDay() + 6) % 7,
            firstThursday;

        target.setUTCDate(target.getUTCDate() - dayNumber + 3);
        firstThursday = target.valueOf();
        target.setUTCMonth(0, 1);

        if (target.getUTCDay() !== 4) {
            target.setUTCMonth(0, 1 + ((4 - target.getUTCDay()) + 7) % 7);
        }

        return Math.ceil((firstThursday - target) /  (7 * 24 * 3600 * 1000)) + 1;
    }

El siguiente código es independiente de la zona horaria (se usan fechas UTC) y funciona de acuerdo con https://en.wikipedia.org/wiki/ISO_8601

Dmitry Volokh
fuente
4

Encontré útil la clase SimpleDateFormat de Java SE descrita en la especificación de Oracle: http://goo.gl/7MbCh5 . En mi caso en Google Apps Script, funcionó así:

function getWeekNumber() {
  var weekNum = parseInt(Utilities.formatDate(new Date(), "GMT", "w"));
  Logger.log(weekNum);
}

Por ejemplo, en una macro de hoja de cálculo, puede recuperar la zona horaria real del archivo:

function getWeekNumber() {
  var weekNum = parseInt(Utilities.formatDate(new Date(), SpreadsheetApp.getActiveSpreadsheet().getSpreadsheetTimeZone(), "w"));
  Logger.log(weekNum);
}
Balu Ertl
fuente
4

Esto agrega el método "getWeek" a Date.prototype, que devuelve el número de semanas desde el comienzo del año. El argumento define qué día de la semana considerar el primero. Si no se pasa ninguna discusión, el primer día se supone el domingo.

/**
 * Get week number in the year.
 * @param  {Integer} [weekStart=0]  First day of the week. 0-based. 0 for Sunday, 6 for Saturday.
 * @return {Integer}                0-based number of week.
 */
Date.prototype.getWeek = function(weekStart) {
    var januaryFirst = new Date(this.getFullYear(), 0, 1);
    if(weekStart !== undefined && (typeof weekStart !== 'number' || weekStart % 1 !== 0 || weekStart < 0 || weekStart > 6)) {
      throw new Error('Wrong argument. Must be an integer between 0 and 6.');
    }
    weekStart = weekStart || 0;
    return Math.floor((((this - januaryFirst) / 86400000) + januaryFirst.getDay() - weekStart) / 7);
};
Tigran
fuente
1
La primera semana calendario de 2016 comienza el 4 de enero en Alemania , pero su función comienza a contar nuevamente desde 0 a partir del 1 de enero. También devuelve números incorrectos al final del año, por ejemplo, 52 para 2018-11-31 (53a semana), aunque ya es la primera semana calendario de 2019 : new Date(Date.UTC(2018,11, 31)).getWeek(1)+1(el lunes es el primer día de la semana en Alemania).
CodeManX
Así fue como se pretendía, y creo que ese es el caso de uso más probable. De lo contrario, los primeros 3 días de 2016 se caerían. Se considera que los primeros días del mes comprenden la primera semana de ese mes, sin importar cuáles y cuántos días hay. Si necesita que la función funcione de manera diferente, puede modificarla según sus necesidades. Del mismo modo, si una semana cae tanto en el año dado como en el año siguiente, se puede llamar la última semana de ese año, así como la primera semana del año siguiente (según la lógica actual).
Tigran
Gracias por la info. Terminé usando la solución de RobG, que implementa las fechas de la semana ISO8601 correctamente (los últimos días de diciembre y los primeros días de enero pueden pertenecer a la semana 52, 53 o 1: en.m.wikipedia.org/wiki/ISO_week_date
CodeManX
4

Obtenga el número de semana de cualquier fecha dada

function week(year,month,day) {
    function serial(days) { return 86400000*days; }
    function dateserial(year,month,day) { return (new Date(year,month-1,day).valueOf()); }
    function weekday(date) { return (new Date(date)).getDay()+1; }
    function yearserial(date) { return (new Date(date)).getFullYear(); }
    var date = year instanceof Date ? year.valueOf() : typeof year === "string" ? new Date(year).valueOf() : dateserial(year,month,day), 
        date2 = dateserial(yearserial(date - serial(weekday(date-serial(1))) + serial(4)),1,3);
    return ~~((date - date2 + serial(weekday(date2) + 5))/ serial(7));
}

Ejemplo

console.log(
    week(2016, 06, 11),//23
    week(2015, 9, 26),//39
    week(2016, 1, 1),//53
    week(2016, 1, 4),//1
    week(new Date(2016, 0, 4)),//1
    week("11 january 2016")//2
);
Hans Petersen
fuente
1
No puedo creerlo, ¡pero esta función es la única que funcionó todo el tiempo! La respuesta aceptada se jugó cuando pasó el horario de verano, otros dijeron '0' como el número de semana en ciertos años. - y algunos se basaron en funciones UTC que a veces regresaron el día anterior, por lo tanto, le asignaron la semana '53' o '54'. Desafortunadamente, necesito que la semana comience un domingo y este código es muy difícil de entender ...
Melissa Zachariadis
@MelissaZachariadis dijo I need the week to begin on a Sunday; Creo que el único cambio necesario es cambiar la función de día de la semana () .getDay()+1a.getDay()
Rafa
4

El siguiente código calcula el número correcto de semana ISO 8601. date("W")Coincide con PHP para todas las semanas entre el 1/1/1970 y el 1/1/2100.

/**
 * Get the ISO week date week number
 */
Date.prototype.getWeek = function () {
  // Create a copy of this date object
  var target = new Date(this.valueOf());

  // ISO week date weeks start on Monday, so correct the day number
  var dayNr = (this.getDay() + 6) % 7;

  // ISO 8601 states that week 1 is the week with the first Thursday of that year
  // Set the target date to the Thursday in the target week
  target.setDate(target.getDate() - dayNr + 3);

  // Store the millisecond value of the target date
  var firstThursday = target.valueOf();

  // Set the target to the first Thursday of the year
  // First, set the target to January 1st
  target.setMonth(0, 1);

  // Not a Thursday? Correct the date to the next Thursday
  if (target.getDay() !== 4) {
    target.setMonth(0, 1 + ((4 - target.getDay()) + 7) % 7);
  }

  // The week number is the number of weeks between the first Thursday of the year
  // and the Thursday in the target week (604800000 = 7 * 24 * 3600 * 1000)
  return 1 + Math.ceil((firstThursday - target) / 604800000);
}

Fuente: Taco van den Broek


Si no estás interesado en extender prototipos, entonces aquí hay una función:

function getWeek(date) {
  if (!(date instanceof Date)) date = new Date();

  // ISO week date weeks start on Monday, so correct the day number
  var nDay = (date.getDay() + 6) % 7;

  // ISO 8601 states that week 1 is the week with the first Thursday of that year
  // Set the target date to the Thursday in the target week
  date.setDate(date.getDate() - nDay + 3);

  // Store the millisecond value of the target date
  var n1stThursday = date.valueOf();

  // Set the target to the first Thursday of the year
  // First, set the target to January 1st
  date.setMonth(0, 1);

  // Not a Thursday? Correct the date to the next Thursday
  if (date.getDay() !== 4) {
    date.setMonth(0, 1 + ((4 - date.getDay()) + 7) % 7);
  }

  // The week number is the number of weeks between the first Thursday of the year
  // and the Thursday in the target week (604800000 = 7 * 24 * 3600 * 1000)
  return 1 + Math.ceil((n1stThursday - date) / 604800000);
}

Uso de la muestra:

getWeek(); // Returns 37 (or whatever the current week is)
getWeek(new Date('Jan 2, 2011')); // Returns 52
getWeek(new Date('Jan 1, 2016')); // Returns 53
getWeek(new Date('Jan 4, 2016')); // Returns 1
Thdoan
fuente
Me gusta esta función, pero tengo una pregunta; ¿Qué hago si quiero volver a ponerlo el domingo? No tengo idea de lo que hace la +6 ) % 7parte. Gracias de un exfoliante!
NoobishPro
1
La semana ISO de @Babydead comienza un lunes, pero JavaScript getDay()comienza un domingo, por lo que si desea que comience el domingo, puede eliminar la corrección:var nDay = date.getDay();
thdoan
He intentado más de 8 implementaciones diferentes de JS para obtener el número de semana. Esta es la única función que funciona, pero solo si cambio todos los captadores y definidores a getUTC ... y setUTC ... No sé por qué. Estaba probando con esto: 2017-07-17T00: 00: 00.000Z (semana 29) 2017-07-23T23: 59: 59.000Z (semana 29) 2021-01-04T00: 00: 00.000Z (semana 1)
psycho brm
2

Si ya está en un proyecto angular, podría usarlo $filter('date').

Por ejemplo:

var myDate = new Date();
var myWeek = $filter('date')(myDate, 'ww');
Gabriel Furstenheim
fuente
2

El fragmento de código que funciona bastante bien para mí es este:

var yearStart = +new Date(d.getFullYear(), 0, 1);
var today = +new Date(d.getFullYear(),d.getMonth(),d.getDate());
var dayOfYear = ((today - yearStart + 1) / 86400000);
return Math.ceil(dayOfYear / 7).toString();

Nota:
des mi fecha para la que quiero el número de la semana actual.
Los +convierte los fechas en números (trabajando con Letra de imprenta).

Vasco
fuente
1

Aquí está mi implementación para calcular el número de semana en JavaScript. corregido por las compensaciones de verano e invierno también. Usé la definición de la semana de este artículo: ISO 8601

Las semanas son de lunes a domingo, y el 4 de enero es siempre la primera semana del año.

// add get week prototype functions
// weeks always start from monday to sunday
// january 4th is always in the first week of the year
Date.prototype.getWeek = function () {
    year = this.getFullYear();
    var currentDotw = this.getWeekDay();
    if (this.getMonth() == 11 && this.getDate() - currentDotw > 28) {
        // if true, the week is part of next year 
        return this.getWeekForYear(year + 1);
    }
    if (this.getMonth() == 0 && this.getDate() + 6 - currentDotw < 4) {
        // if true, the week is part of previous year
        return this.getWeekForYear(year - 1);
    }
    return this.getWeekForYear(year);
}

// returns a zero based day, where monday = 0
// all weeks start with monday
Date.prototype.getWeekDay = function () {
    return  (this.getDay() + 6) % 7;
}

// corrected for summer/winter time
Date.prototype.getWeekForYear = function (year) {
    var currentDotw = this.getWeekDay();
    var fourjan = new Date(year, 0, 4);
    var firstDotw = fourjan.getWeekDay();
    var dayTotal = this.getDaysDifferenceCorrected(fourjan) // the difference in days between the two dates.
    // correct for the days of the week
    dayTotal += firstDotw; // the difference between the current date and the first monday of the first week, 
    dayTotal -= currentDotw; // the difference between the first monday and the current week's monday
    // day total should be a multiple of 7 now
    var weeknumber = dayTotal / 7 + 1; // add one since it gives a zero based week number.
    return weeknumber;
}

// corrected for timezones and offset
Date.prototype.getDaysDifferenceCorrected = function (other) {
    var millisecondsDifference = (this - other);
    // correct for offset difference. offsets are in minutes, the difference is in milliseconds
    millisecondsDifference += (other.getTimezoneOffset()- this.getTimezoneOffset()) * 60000;
    // return day total. 1 day is 86400000 milliseconds, floor the value to return only full days
    return Math.floor(millisecondsDifference / 86400000);
}

para probar utilicé las siguientes pruebas de JavaScript en Qunit

var runweekcompare = function(result, expected) {
    equal(result, expected,'Week nr expected value: ' + expected + ' Actual value: ' + result);
}

test('first week number test', function () {
    expect(5);
    var temp = new Date(2016, 0, 4); // is the monday of the first week of the year
    runweekcompare(temp.getWeek(), 1);
    var temp = new Date(2016, 0, 4, 23, 50); // is the monday of the first week of the year
    runweekcompare(temp.getWeek(), 1);
    var temp = new Date(2016, 0, 10, 23, 50); // is the sunday of the first week of the year
    runweekcompare(temp.getWeek(), 1);
    var temp = new Date(2016, 0, 11, 23, 50); // is the second week of the year
    runweekcompare(temp.getWeek(), 2);
    var temp = new Date(2016, 1, 29, 23, 50); // is the 9th week of the year
    runweekcompare(temp.getWeek(), 9);
});

test('first day is part of last years last week', function () {
    expect(2);
    var temp = new Date(2016, 0, 1, 23, 50); // is the first last week of the previous year
    runweekcompare(temp.getWeek(), 53);
    var temp = new Date(2011, 0, 2, 23, 50); // is the first last week of the previous year
    runweekcompare(temp.getWeek(), 52);
});

test('last  day is part of next years first week', function () {
    var temp = new Date(2013, 11, 30); // is part of the first week of 2014
    runweekcompare(temp.getWeek(), 1);
});

test('summer winter time change', function () {
    expect(2);
    var temp = new Date(2000, 2, 26); 
    runweekcompare(temp.getWeek(), 12);
    var temp = new Date(2000, 2, 27); 
    runweekcompare(temp.getWeek(), 13);
});

test('full 20 year test', function () {
    //expect(20 * 12 * 28 * 2);
    for (i = 2000; i < 2020; i++) {
        for (month = 0; month < 12; month++) {
            for (day = 1; day < 29 ; day++) {
                var temp = new Date(i, month, day);
                var expectedweek = temp.getWeek();
                var temp2 = new Date(i, month, day, 23, 50);
                var resultweek = temp.getWeek();
                equal(expectedweek, Math.round(expectedweek), 'week number whole number expected ' + Math.round(expectedweek) + ' resulted week nr ' + expectedweek);
                equal(resultweek, expectedweek, 'Week nr expected value: ' + expectedweek + ' Actual value: ' + resultweek + ' for year ' + i + ' month ' + month + ' day ' + day);
            }
        }
    }
});
martijn
fuente
0

Esta semana, el número ha sido un verdadero dolor en el a **. La mayoría de los guiones en la red no me funcionaron. Trabajaron la mayor parte del tiempo, pero todos se rompieron en algún momento, especialmente cuando el año cambió y la última semana del año fue repentinamente la primera semana del próximo año, etc. Incluso el filtro de fecha de Angular mostró datos incorrectos (era la primera semana del próximo año, angular dio semana 53).

Nota: ¡Los ejemplos están diseñados para funcionar con semanas europeas (lunes primero)!

getWeek ()

Date.prototype.getWeek = function(){

    // current week's Thursday
    var curWeek = new Date(this.getTime());
        curWeek.setDay(4);

    // Get year's first week's Thursday
    var firstWeek = new Date(curWeek.getFullYear(), 0, 4);
        firstWeek.setDay(4);

    return (curWeek.getDayIndex() - firstWeek.getDayIndex()) / 7 + 1;
};

setDay ()

/**
* Make a setDay() prototype for Date
* Sets week day for the date
*/
Date.prototype.setDay = function(day){

    // Get day and make Sunday to 7
    var weekDay = this.getDay() || 7;
    var distance = day - weekDay;
    this.setDate(this.getDate() + distance);

    return this;
}

getDayIndex ()

/*
* Returns index of given date (from Jan 1st)
*/

Date.prototype.getDayIndex = function(){
    var start = new Date(this.getFullYear(), 0, 0);
    var diff = this - start;
    var oneDay = 86400000;

    return Math.floor(diff / oneDay);
};

He probado esto y parece estar funcionando muy bien, pero si nota una falla, hágamelo saber.

Spacha
fuente
0

Intenté mucho obtener el código más corto para obtener el número ISO semanal.

Date.prototype.getWeek=function(){
    var date=new Date(this);
    date.setHours(0,0,0,0);
    return Math.round(((date.setDate(this.getDate()+2-(this.getDay()||7))-date.setMonth(0,4))/8.64e7+3+(date.getDay()||7))/7)+"/"+date.getFullYear();}

La variable datees necesaria para evitar alterar el original this. Utilicé los valores de retorno de setDate()y setMonth()para prescindir getTime()para guardar la longitud del código y utilicé un número exponencial durante milisegundos de un día en lugar de una multiplicación de elementos individuales o un número con cinco ceros. thises la fecha o el número de milisegundos, el valor de retorno es, Stringpor ejemplo, "49/2017".

Sven Huber
fuente
0

Otra opción basada en la biblioteca: use d3-time-format:

const formatter = d3.timeFormat('%U');
const weekNum = formatter(new Date());
ericsoco
fuente
0

La solución más corta para Angular2 + DatePipe, ajustada para ISO-8601:

import {DatePipe} from "@angular/common";

public rightWeekNum: number = 0;
  
constructor(private datePipe: DatePipe) { }
    
calcWeekOfTheYear(dateInput: Date) {
  let falseWeekNum = parseInt(this.datePipe.transform(dateInput, 'ww'));
  this.rightWeekNum = falseWeekNum ? falseWeekNum : falseWeekNum-1;
}
conectado
fuente
-1
now = new Date();
today = new Date(now.getFullYear(), now.getMonth(), now.getDate());
firstOfYear = new Date(now.getFullYear(), 0, 1);
numOfWeek = Math.ceil((((today - firstOfYear) / 86400000)-1)/7);
Le Dang Duong
fuente