transcurrido - Calcular el último día del mes en JavaScript
restar meses fecha javascript (15)
Si proporciona 0
como dayValue
en Date.setFullYear
, obtendrá el último día del mes anterior:
d = new Date(); d.setFullYear(2008, 11, 0); // Sun Nov 30 2008
Hay referencia a este comportamiento en mozilla . ¿Es esta una función confiable para todos los navegadores o debo buscar métodos alternativos?
A continuación la función da el último día del mes:
function getLstDayOfMonFnc(date)
{
return new Date(date.getFullYear(), date.getMonth(), 0).getDate()
}
console.log(getLstDayOfMonFnc(new Date(2016, 2, 15))) // Output : 29
console.log(getLstDayOfMonFnc(new Date(2017, 2, 15))) // Output : 28
console.log(getLstDayOfMonFnc(new Date(2017, 11, 15))) // Output : 30
console.log(getLstDayOfMonFnc(new Date(2017, 12, 15))) // Output : 31
Del mismo modo podemos obtener el primer día del mes:
function getFstDayOfMonFnc(date)
{
return new Date(date.getFullYear(), date.getMonth(), 1).getDate()
}
console.log(getFstDayOfMonFnc(new Date(2016, 2, 15))) // Output : 1
En términos informáticos, las new Date()
soluciones new Date()
y de regular expression
son lentas. Si desea una línea súper rápida (y supercríptica), pruebe esta (suponiendo que m
está en formato Jan=1
). Sigo intentando diferentes cambios de código para obtener el mejor rendimiento.
Mi versión más rápida actual:
Después de ver esta pregunta relacionada, revisar el año bisiesto utilizando operadores bitwise (velocidad asombrosa) y descubrir lo que representan los números mágicos 25 y 15, he encontrado este híbrido de respuestas optimizado:
function getDaysInMonth(m, y) {
return m===2 ? y & 3 || !(y%25) && y & 15 ? 28 : 29 : 30 + (m+(m>>3)&1);
}
Dado el desplazamiento de bits, esto obviamente supone que los parámetros m
& y
son ambos enteros, ya que los números pasados como cadenas darían como resultado resultados extraños.
JSFiddle: http://jsfiddle.net/TrueBlueAussie/H89X3/22/
Resultados de JSPerf: http://jsperf.com/days-in-month-head-to-head/5
Por alguna razón, (m+(m>>3)&1)
es más eficiente que (5546>>m&1)
en casi todos los navegadores.
La única competencia real para la velocidad es de @GitaarLab, por lo que he creado un JSPerf cara a cara para que lo probemos en: http://jsperf.com/days-in-month-head-to-head/5
Funciona en función de mi respuesta del año bisiesto aquí: javascript para encontrar el año bisiesto esta respuesta aquí Verificación del año bisiesto utilizando operadores bitwise (velocidad asombrosa) así como la siguiente lógica binaria.
Una lección rápida en meses binarios:
Si interpreta el índice de los meses deseados (enero = 1) en binario , notará que los meses con 31 días tienen el bit 3 limpio y el bit 0 establecido, o el bit 3 establecido y el bit 0 despejado.
Jan = 1 = 0001 : 31 days
Feb = 2 = 0010
Mar = 3 = 0011 : 31 days
Apr = 4 = 0100
May = 5 = 0101 : 31 days
Jun = 6 = 0110
Jul = 7 = 0111 : 31 days
Aug = 8 = 1000 : 31 days
Sep = 9 = 1001
Oct = 10 = 1010 : 31 days
Nov = 11 = 1011
Dec = 12 = 1100 : 31 days
Eso significa que puede cambiar el valor 3 lugares con >> 3
, XOR los bits con el ^ m
original y ver si el resultado es 1
o 0
en la posición de bit 0 usando & 1
. Nota: Resulta que +
es ligeramente más rápido que XOR ( ^
) y (m >> 3) + m
da el mismo resultado en el bit 0.
Resultados de JSPerf : jsperf.com/days-in-month-perf-test/6
Este funciona muy bien:
Date.prototype.setToLastDateInMonth = function () {
this.setDate(1);
this.setMonth(this.getMonth() + 1);
this.setDate(this.getDate() - 1);
return this;
}
Esto funciona para mi Proporcionará el último día del año y mes dado:
var d = new Date(2012,02,0);
var n = d.getDate();
alert(n);
Hace poco tuve que hacer algo similar, esto es lo que se me ocurrió:
/**
* Returns a date set to the begining of the month
*
* @param {Date} myDate
* @returns {Date}
*/
function beginningOfMonth(myDate){
let date = new Date(myDate);
date.setDate(1)
date.setHours(0);
date.setMinutes(0);
date.setSeconds(0);
return date;
}
/**
* Returns a date set to the end of the month
*
* @param {Date} myDate
* @returns {Date}
*/
function endOfMonth(myDate){
let date = new Date(myDate);
date.setMonth(date.getMonth() +1)
date.setDate(0);
date.setHours(23);
date.setMinutes(59);
date.setSeconds(59);
return date;
}
Páselo en una fecha y devolverá una fecha establecida al principio del mes o al final del mes.
La función begninngOfMonth
es bastante autoexplicativa, pero lo que está ocurriendo en la función endOfMonth
es que estoy incrementando el mes al mes siguiente, y luego uso setDate(0)
para revertir el día al último día del mes anterior que es parte de la especificación de setDate:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setDate https://www.w3schools.com/jsref/jsref_setdate.asp
Luego, configuro la hora / minutos / segundos al final del día, de modo que si está utilizando algún tipo de API que espera un intervalo de fechas, podrá capturar la totalidad del último día. Esa parte podría ir más allá de lo que solicita la publicación original, pero podría ayudar a alguien más a buscar una solución similar.
Editar: También puede hacer un setMilliseconds()
adicional y establecer milisegundos con setMilliseconds()
si desea ser más preciso.
Me parece que esta es la mejor solución para mí. Deje que el objeto Date lo calcule por usted.
var today = new Date();
var lastDayOfMonth = new Date(today.getFullYear(), today.getMonth()+1, 0);
Establecer el parámetro día en 0 significa un día menos que el primer día del mes que es el último día del mes anterior.
Mi colega se topó con lo siguiente, que puede ser una solución más fácil
function daysInMonth(iMonth, iYear)
{
return 32 - new Date(iYear, iMonth, 32).getDate();
}
Sé que es solo una cuestión de semántica, pero terminé usándolo de esta forma.
var lastDay = new Date(new Date(2008, 11+1,1) - 1).getDate();
console.log(lastDay);
Dado que las funciones se resuelven desde el argumento interno, hacia afuera, funciona de la misma manera.
Luego puede reemplazar el año y mes / año con los detalles requeridos, ya sea desde la fecha actual. O un mes / año particular.
Una ligera modificación de la solución proporcionada por lebreeze :
function daysInMonth(iMonth, iYear)
{
return new Date(iYear, iMonth, 0).getDate();
}
Usaría una fecha intermedia el primer día del siguiente mes y devolvería la fecha del día anterior:
int_d = new Date(2008, 11+1,1);
d = new Date(int_d - 1);
establezca el mes que necesita para la fecha y luego establezca el día en cero, de modo que el mes comience en 1 - 31 en la función de fecha y luego obtenga el último día ^^
var last = new Date(new Date(new Date().setMonth(7)).setDate(0)).getDate();
console.log(last);
prueba este
lastDateofTheMonth = new Date(year, month, 0)
ejemplo:
new Date(2012, 8, 0)
salida:
Date {Fri Aug 31 2012 00:00:00 GMT+0900 (Tokyo Standard Time)}
Esto le dará mes actual primero y último día.
Si necesita cambiar ''año'', elimine d.getFullYear () y establezca su año.
Si necesita cambiar ''mes'', elimine d.getMonth () y establezca su año.
var d = new Date();
var days = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
var fistDayOfMonth = days[(new Date(d.getFullYear(), d.getMonth(), 1).getDay())];
var LastDayOfMonth = days[(new Date(d.getFullYear(), d.getMonth() + 1, 0).getDay())];
console.log("First Day :" + fistDayOfMonth);
console.log("Last Day:" + LastDayOfMonth);
alert("First Day :" + fistDayOfMonth);
alert("Last Day:" + LastDayOfMonth);
function getLastDay(y, m) {
return 30 + (m <= 7 ? ((m % 2) ? 1 : 0) : (!(m % 2) ? 1 : 0)) - (m == 2) - (m == 2 && y % 4 != 0 || !(y % 100 == 0 && y % 400 == 0));
}
var month = 0; // January
var d = new Date(2008, month + 1, 0);
alert(d); // last day in January
IE 6: Thu Jan 31 00:00:00 CST 2008
IE 7: Thu Jan 31 00:00:00 CST 2008
IE 8: Beta 2: Thu Jan 31 00:00:00 CST 2008
Opera 8.54: Thu, 31 Jan 2008 00:00:00 GMT-0600
Opera 9.27: Thu, 31 Jan 2008 00:00:00 GMT-0600
Opera 9.60: Thu Jan 31 2008 00:00:00 GMT-0600
Firefox 2.0.0.17: Thu Jan 31 2008 00:00:00 GMT-0600 (Canada Central Standard Time)
Firefox 3.0.3: Thu Jan 31 2008 00:00:00 GMT-0600 (Canada Central Standard Time)
Google Chrome 0.2.149.30: Thu Jan 31 2008 00:00:00 GMT-0600 (Canada Central Standard Time)
Safari for Windows 3.1.2: Thu Jan 31 2008 00:00:00 GMT-0600 (Canada Central Standard Time)
Las diferencias de salida se deben a diferencias en la implementación de toString()
, no porque las fechas son diferentes.
Por supuesto, solo porque los navegadores identificados arriba usan 0 como el último día del mes anterior no significa que continuarán haciéndolo, o porque los navegadores no listados lo harán, pero le dan credibilidad a la creencia de que debería funcionar correctamente. De la misma manera en todos los navegadores.