restar - ¿Cómo calculo la fecha en JavaScript tres meses antes de hoy?
obtener fecha y hora actual javascript (13)
En mi caso, necesitaba restar 1 mes a la fecha actual. La parte importante fue el número del mes, por lo que no me importa en qué día del mes en que se encuentra, lo necesitaba el mes pasado. Este es mi código:
var dateObj = new Date(''2017-03-30 00:00:00''); //Create new date object
console.log(dateObj); // Thu Mar 30 2017 00:00:00 GMT-0300 (ART)
dateObj.setDate(1); //Set first day of the month from current date
dateObj.setDate(-1); // Substract 1 day to the first day of the month
//Now, you are in the last month
console.log(dateObj); // Mon Feb 27 2017 00:00:00 GMT-0300 (ART)
Restar 1 mes a la fecha real no es exacto, es por eso que en primer lugar establezco el primer día del mes (el primer día de cualquier mes siempre es el primer día) y en el segundo lugar restar 1 día, que siempre te envía al mes pasado. Espero ayudarte, amigo.
var dateObj = new Date(''2017-03-30 00:00:00''); //Create new date object
console.log(dateObj); // Thu Mar 30 2017 00:00:00 GMT-0300 (ART)
dateObj.setDate(1); //Set first day of the month from current date
dateObj.setDate(-1); // Substract 1 day to the first day of the month
//Now, you are in the last month
console.log(dateObj); // Mon Feb 27 2017 00:00:00 GMT-0300 (ART)
Estoy tratando de formar una fecha que es 3 meses antes de la fecha actual. Obtengo el mes actual por el siguiente código
var currentDate = new Date();
var currentMonth = currentDate.getMonth()+1;
¿Pueden aportarme la lógica para calcular y formar una fecha (un objeto del tipo de datos de Date
) teniendo en cuenta que cuando el mes es enero (1), 3 meses antes de la fecha sería octubre (10)?
Esto debería manejar la suma / resta, solo agrega un valor negativo para restar y un valor positivo para sumar. Esto también resuelve el problema de cruce de mes.
function monthAdd(date, month) {
var temp = date;
temp = new Date(date.getFullYear(), date.getMonth(), 1);
temp.setMonth(temp.getMonth() + (month + 1));
temp.setDate(temp.getDate() - 1);
if (date.getDate() < temp.getDate()) {
temp.setDate(date.getDate());
}
return temp;
}
Me gusta la simplicidad de la respuesta de gilly3 , pero los usuarios probablemente se sorprenderán de que un mes antes del 31 de marzo sea el 3 de marzo. Elegí implementar una versión que permanezca hasta fin de mes, por lo que un mes antes del 28, 29 y 30 de marzo y 31 serán todos el 28 de febrero cuando no sea un año bisiesto.
function addMonths(date, months) {
var result = new Date(date),
expectedMonth = ((date.getMonth() + months) % 12 + 12) % 12;
result.setMonth(result.getMonth() + months);
if (result.getMonth() !== expectedMonth) {
result.setDate(0);
}
return result;
}
var dt2004_05_31 = new Date("2004-05-31 0:00"),
dt2001_05_31 = new Date("2001-05-31 0:00"),
dt2001_03_31 = new Date("2001-03-31 0:00"),
dt2001_02_28 = new Date("2001-02-28 0:00"),
result = addMonths(dt2001_05_31, -2);
console.assert(dt2001_03_31.getTime() == result.getTime(), result.toDateString());
result = addMonths(dt2001_05_31, -3);
console.assert(dt2001_02_28.getTime() == result.getTime(), result.toDateString());
result = addMonths(dt2001_05_31, 36);
console.assert(dt2004_05_31.getTime() == result.getTime(), result.toDateString());
result = addMonths(dt2004_05_31, -38);
console.assert(dt2001_03_31.getTime() == result.getTime(), result.toDateString());
console.log(''Done.'');
Para simplificar las cosas, puede usar DateJS, una biblioteca de fechas para JavaScript:
Código de ejemplo para ti:
Date.today().add({ months: -1 });
Recomiendo usar una biblioteca llamada Moment.js.
Está bien probado, funciona en el navegador cruzado y en el lado del servidor (lo estoy usando tanto en proyectos angulares como de nodos). Tiene un gran soporte para las fechas locales.
var threeMonthsAgo = moment().subtract(3, ''months'');
console.log(threeMonthsAgo.format()); // 2015-10-13T09:37:35+02:00
.format()
devuelve una representación de cadena de fecha formateada en formato ISO 8601 . También puede usarlo con un formato de fecha personalizado como este: .format(''dddd, MMMM Do YYYY, h:mm:ss a'')
Si el método setMonth
ofrecido por gilly3 no es lo que estás buscando, considera:
var someDate = new Date(); // add arguments as needed
someDate.setTime(someDate.getTime() - 3*28*24*60*60);
// assumes the definition of "one month" to be "four weeks".
Se puede usar por cualquier cantidad de tiempo, solo establece los múltiplos correctos.
Un "un trazador de líneas" (en muchas líneas para facilitar la lectura) para poner directamente en una variable:
var oneMonthAgo = new Date(
new Date().getFullYear(),
new Date().getMonth() - 1,
new Date().getDate()
);
Ya hay una respuesta elegante, pero creo que es difícil de leer, así que hice mi propia función. Para mis propósitos, no necesitaba un resultado negativo, pero no sería difícil modificarlo.
var subtractMonths = function (date1,date2) {
if (date1-date2 <=0) {
return 0;
}
var monthCount = 0;
while (date1 > date2){
monthCount++;
date1.setMonth(date1.getMonth() -1);
}
return monthCount;
}
var date=document.getElementById("date");
var d = new Date();
document.write(d + "<br/>");
d.setMonth(d.getMonth() - 6);
document.write(d);
if(d<date)
document.write("lesser then 6 months");
else
document.write("greater then 6 months");
var d = new Date();
document.write(d + "<br/>");
d.setMonth(d.getMonth() - 6);
document.write(d);
var d = new Date("2013/01/01");
console.log(d.toLocaleDateString());
d.setMonth(d.getMonth() + 18);
console.log(d.toLocaleDateString());
Following code give me Just Previous Month From Current Month even the date is 31/30 of current date and last month is 30/29/28 days:
<!DOCTYPE html>
<html>
<body>
<p>Click the button to display the date after changing the month.</p>
<button onclick="myFunction()">Try it</button>
<p id="demo"></p>
<script>
function myFunction() {
var d = new Date("March 29, 2017"); // Please Try the result also for "March 31, 2017" Or "March 30, 2017"
var OneMonthBefore =new Date(d);
OneMonthBefore.setMonth(d.getMonth(),0);
if(OneMonthBefore.getDate() < d.getDate() )
{
d.setMonth(d.getMonth(),0);
}else
{
d.setMonth(d.getMonth()-1);
}
document.getElementById("demo").innerHTML = d;
}
</script>
</body>
</html>
var d = new Date();
d.setMonth(d.getMonth() - 3);
Esto funciona para enero. Ejecute este fragmento:
var d = new Date("2012/01/14");
console.log(d.toLocaleDateString());
d.setMonth(d.getMonth() - 3);
console.log(d.toLocaleDateString());