2012-06-07 34 views
63

Quiero permitir a los usuarios agregar y quitar fechas fácilmente mediante JavaScript para navegar por sus entradas por fecha.¿Cómo agregar/restar fechas con JavaScript?

Las fechas tienen el formato: "mm/dd/aaaa". Quiero que puedan hacer clic en el botón "Siguiente", y si la fecha es: "06/01/2012" y luego al hacer clic en siguiente, debería convertirse en: "06/02/2012". Si hacen clic en el botón 'prev', debería convertirse en "31/05/2012".

Se necesita hacer un seguimiento de los años bisiestos, el número de días del mes, etc.

¿Alguna idea?

P.S usar AJAX para obtener la fecha del servidor no es una opción, es un poco lento y no es la experiencia para el usuario que el cliente quiere.

+1

si está utilizando datepicker. luego 'dateValue = $ .datepicker.parseDate (" mm/dd/aa ", '06/01/2012 ');' 'dateValue.setDate (dateValue.getDate() + 1);' –

Respuesta

83

Código:

var date = new Date('2011','01','02'); 
alert('the original date is '+date); 
var newdate = new Date(date); 

newdate.setDate(newdate.getDate() - 7); // minus the date 

var nd = new Date(newdate); 
alert('the new date is '+nd);​ 

JSFiddle Demo

Usando selector de fechas:

$("#in").datepicker({ 
    minDate: 0, 
    onSelect: function(dateText, inst) { 
     var actualDate = new Date(dateText); 
     var newDate = new Date(actualDate.getFullYear(), actualDate.getMonth(), actualDate.getDate()+1); 
     $('#out').datepicker('option', 'minDate', newDate); 
    } 
}); 

$("#out").datepicker();​ 

JSFiddle Demo

material extra que podría venir a mano:

getDate() Returns the day of the month (from 1-31) 
getDay() Returns the day of the week (from 0-6) 
getFullYear() Returns the year (four digits) 
getHours() Returns the hour (from 0-23) 
getMilliseconds() Returns the milliseconds (from 0-999) 
getMinutes() Returns the minutes (from 0-59) 
getMonth() Returns the month (from 0-11) 
getSeconds() Returns the seconds (from 0-59) 

Buen enlace:MDN Date

+0

¿Por qué crear una tercera fecha nueva? : var nd = new Date (newdate) ?? El objeto date, newdate, ajustado por .setDate está bien, ¿no? –

+0

@KevinM sí, depende de la finalidad, por lo que 'nd' es una nueva fecha ¡' var' se acaba de crear para mayor claridad! ':)' –

1

Puede utilizar el objeto Fecha nativo de javascript para realizar un seguimiento de las fechas. Le dará la fecha actual, le permitirá realizar un seguimiento de las cosas específicas del calendario e incluso ayudarlo a administrar diferentes zonas horarias. Puede agregar y restar días/horas/segundos para cambiar la fecha en que está trabajando o para calcular nuevas fechas.

echar un vistazo a esta referencia de objeto para aprender más:

Date

Espero que ayude!

14
startdate.setDate(startdate.getDate() - daysToSubtract); 


startdate.setDate(startdate.getDate() + daysToAdd); 
4

Puede ser que esto podría ayudar a

<script type="text/javascript" language="javascript"> 
     function AddDays(toAdd) { 
      if (!toAdd || toAdd == '' || isNaN(toAdd)) return; 
      var d = new Date(); 
      d.setDate(d.getDate() + parseInt(toAdd)); 

      document.getElementById("result").innerHTML = d.getDate() + "/" + d.getMonth() + "/" + d.getFullYear(); 
     } 

function SubtractDays(toAdd) { 
      if (!toAdd || toAdd == '' || isNaN(toAdd)) return; 
      var d = new Date(); 
      d.setDate(d.getDate() - parseInt(toAdd)); 

      document.getElementById("result").innerHTML = d.getDate() + "/" + d.getMonth() + "/" + d.getFullYear(); 
     } 
    </script> 
    ---------------------- UI --------------- 
     <div id="result"> 
     </div> 
     <input type="text" value="0" onkeyup="AddDays(this.value);" /> 
     <input type="text" value="0" onkeyup="SubtractDays(this.value);" /> 
6

El objeto JavaScript Date puede ayudar aquí.

El primer paso es convertir esas cadenas en instancias Date. Eso es fácil de hacer:

var str = "06/07/2012"; // E.g., "mm/dd/yyyy"; 
var dt = new Date(parseInt(str.substring(6), 10),  // Year 
        parseInt(str.substring(0, 2), 10) - 1, // Month (0-11) 
        parseInt(str.substring(3, 5), 10)); // Day 

Luego puede hacer todo tipo de cálculos útiles. Las fechas de JavaScript comprenden los años bisiestos y tal. Utilizan un concepto idealizado de "día" que es exactamente 86,400 segundos de duración. Su valor subyacente es la cantidad de milisegundos desde The Epoch (medianoche, 1 de enero de 1970); puede ser un número negativo para las fechas anteriores a The Epoch.

Más sobre el MDN page on Date.

También puede considerar el uso de una biblioteca como MomentJS, lo que ayudará con el análisis, haciendo matemáticas fecha, el formato ...

+4

no rellene las fechas con personas. Solo usa moment.js y guarda tu cabello. –

3

Utilización de fechas en JavaScript es siempre un poco de una molestia. Siempre termino usando una biblioteca. Moment.js y XDate son estupendos:

http://momentjs.com/

http://arshaw.com/xdate/

violín:

http://jsfiddle.net/39fWa/

var $output = $('#output'), 
    tomorrow = moment().add('days', 1); 

$('<pre />').appendTo($output).text(tomorrow); 

tomorrow = new XDate().addDays(-1); 

$('<pre />').appendTo($output).text(tomorrow); 

+0

He visto momentos en los que moment.js calcula una cantidad de meses no válida durante un intervalo de fechas (por ejemplo, entre las fechas del 13 de febrero de 2014 y 15 de marzo de 2016). Moment.js informará que hay 26 meses cuando la mayoría de los lenguajes con clases incorporadas de Date o DateTime reporten este mismo intervalo como 25. XDate parece calcular ese intervalo correctamente. – AndrewPK

4
//In order to get yesterday's date in mm/dd/yyyy. 


function gimmeYesterday(toAdd) { 
      if (!toAdd || toAdd == '' || isNaN(toAdd)) return; 
      var d = new Date(); 
      d.setDate(d.getDate() - parseInt(toAdd)); 
var yesterDAY = (d.getMonth() +1) + "/" + d.getDate() + "/" + d.getFullYear(); 
$("#endDate").html(yesterDAY); 
     } 
$(document).ready(function() { 
gimmeYesterday(1); 
}); 

puede intentar aquí: http://jsfiddle.net/ZQAHE/

32

Es necesario utilizar getTime() y setTime() para añadir o restar el tiempo en un objeto Date de JavaScript. El uso de setDate() y getDate() dará lugar a errores al alcanzar los límites de los meses 1, 30, 31, etc ..

usando setTime le permite definir un desplazamiento en milisegundos, y dejar que la figura de la fecha objeto el resto:

var now=new Date(); 
var yesterdayMs = now.getTime() - 1000*60*60*24*1; // Offset by one day; 
now.setTime(yesterdayMs); 
+2

Esta es la única solución que funcionó para mí. El constructor Fecha parece comportarse de manera extraña cuando se usa un número negativo para el índice del día. Encontré que la única manera de resolverlo era trabajando directamente con milisegundos –

+0

¡La mejor solución !. Todas las otras soluciones que usan setDate deben ser downvoted ... podría haberme causado un montón de problemas ... – abimelex

+0

Ditto. Esta es la solución más limpia y confiable. Gracias @decasteljau – GR7

2

De la manera que me gusta, si tiene un objeto de fecha puede restarle otro objeto de fecha para obtener la diferencia. Los objetos de fecha se basan en milisegundos desde una fecha determinada.

var date1 = new Date(2015, 02, 18); // "18/03/2015", month is 0-index 
var date2 = new Date(2015, 02, 20); // "20/03/2015" 

var msDiff = date2 - date1; // 172800000, this is time in milliseconds 
var daysDiff = msDiff/1000/60/60/24; // 2 days 

Así es como restas las fechas. Ahora si quieres agregarlos? fecha1 + fecha2 da un error .. Pero si quiero obtener el tiempo en ms que puede utilizar:

var dateMs = date1 - 0; 
// say I want to add 5 days I can use 
var days = 5; 
var msToAdd = days * 24 * 60 * 60 * 1000; 
var newDate = new Date(dateMs + msToAdd); 

Restando 0 se gira el objeto de fecha en el formato de milisegundos.

0

Algo que estoy usando (se necesita jquery), en mi script lo necesito para el día actual, pero por supuesto puede editarlo en consecuencia.

HTML:

<label>Date:</label><input name="date" id="dateChange" type="date"/> 
<input id="SubtractDay" type="button" value="-" /> 
<input id="AddDay" type="button" value="+" /> 

JavaScript:

var counter = 0; 

$("#SubtractDay").click(function() { 
    counter--; 
    var today = new Date(); 
    today.setDate(today.getDate() + counter); 
    var formattedDate = new Date(today); 
    var d = ("0" + formattedDate.getDate()).slice(-2); 
    var m = ("0" + (formattedDate.getMonth() + 1)).slice(-2); 
    var y = formattedDate.getFullYear(); 
    $("#dateChange").val(d + "/" + m + "/" + y); 
}); 
$("#AddDay").click(function() { 
    counter++; 
    var today = new Date(); 
    today.setDate(today.getDate() + counter); 
    var formattedDate = new Date(today); 
    var d = ("0" + formattedDate.getDate()).slice(-2); 
    var m = ("0" + (formattedDate.getMonth() + 1)).slice(-2); 
    var y = formattedDate.getFullYear(); 
    $("#dateChange").val(d + "/" + m + "/" + y); 
}); 

jsfiddle

0
var date = new Date('your date string here'); // e.g. '2017-11-21' 

var newdate = new Date(date.getTime() + 24*60*60*1000 * days) // days is the number of days you want to shift the date by 

Ésta es la única solución que funciona de forma fiable cuando suma/resta a través de meses y años. Se dio cuenta de esto después de pasar demasiado tiempo rebuscando con los métodos getDate y setDate, tratando de ajustar los cambios de mes/año.

decasteljau (en este hilo) ya ha respondido esto pero solo quiero enfatizar la utilidad de este método porque el 90% de las respuestas recomiendan el enfoque getDate y setDate.