yyyy now javascript date

now - javascript datetime format



Obtenga la semana del año en JavaScript como en PHP (15)

Accidentalmente 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); };

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

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


Aquí está mi implementación para calcular el número de semana en JavaScript. corregido para las compensaciones de verano y de invierno también. Utilicé la definición de la semana de este artículo: https://en.wikipedia.org/wiki/ISO_8601

Las semanas son de lunes a domingo, y el 4 de enero siempre es en 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); } } } });


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 );


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: trabajando con semanas .

Editar

Aquí hay un código basado en los enlaces proporcionados y publicado por Dommer. Ha sido probado a la ligera contra los resultados en http://www.merlyn.demon.co.uk/js-date6.htm#YWD . Por favor, prueba a fondo, sin 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 viernes. Se solucionó al usar 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 (devuelve solo 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 YYYY-MM-DD y verificar que este código brinde el mismo número de semana que el número de semana ISO de Moment.js (probado durante 50 años desde 2000 hasta 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>


El siguiente código calcula el número correcto de la semana ISO 8601. Concuerda con la date("W") de PHP date("W") para cada semana entre 1/1/1970 y 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 te interesa extender prototipos, aquí tienes 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 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


Encontré útil la clase SimpleDateFormat de Java SE descrita en las especificaciones 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); }


Esta semana, lo de números ha sido un verdadero dolor en el a **. La mayoría de los guiones de la red no funcionaron para mí. Trabajaron la mayor parte del tiempo, pero todos se rompieron en algún punto, especialmente cuando el año cambió y la semana pasada del año fue repentinamente la primera semana del año siguiente, etc. Incluso el filtro de fecha de Angular mostró datos incorrectos (fue la primera semana del año siguiente, angular 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); };

Lo he probado y parece funcionar muy bien, pero si nota un defecto en él, hágamelo saber.


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 aprobó ningún argumento, el primer día se asume 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); };


Intenté mucho para obtener el código más corto para obtener el número de semana conforme a ISO.

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 date variable es necesaria para evitar alterar el original. setDate() valores de retorno de setDate() y setMonth() para prescindir de getTime() para guardar la longitud del código y utilicé un número exponencial para milisegundos de un día en lugar de una multiplicación de elementos individuales o un número con cinco ceros. this es la Fecha o Número de milisegundos, el valor de retorno es String por ejemplo, "49/2017".


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

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

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


Obtener 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 );



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

Por ejemplo:

var myDate = new Date(); var myWeek = $filter(''date'')(myDate, ''ww'');


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 las fechas UTC) y funciona de acuerdo con https://en.wikipedia.org/wiki/ISO_8601


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);