una transcurrido tiempo sumar restar obtener meses horas hora fechas fecha diferencia comparar calcular actual javascript date

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.



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.