Tengo una fecha que es typeof string en el formato de "5/12/2016". Quiero convertir a un objeto de fecha, agregar 90 días y comparar las fechas ... es decir. verifique si la fecha original es menor que la nueva con 90 días agregados.

Paso la cadena de fecha en el constructor de fecha para obtener un objeto de fecha y luego uso el método setDate que pasa en 90 días. La fecha en que regreso es de 78 días en el futuro y no 90 días. ¿Qué me estoy perdiendo?

alert(typeof startDate); // string
alert(startDate); // "5/12/2016"
var convertedStartDate = new Date(startDate);
alert(convertedStartDate); // Thu May 12 2016 00:00:00 GMT-0500 (Central Standard Time)
var startDatePlusNinetyDays = convertedStartDate.setDate(90);
alert(startDatePlusNinetyDays);
startDatePlusNinetyDays = new Date(startDatePlusNinetyDays);
alert(startDatePlusNinetyDays); // Thu July 29 2016 00:00:00 GMT-0500 (Central Standard Time)

Gracias.

0
Dman100 13 may. 2016 a las 22:24

4 respuestas

La mejor respuesta

setDate(90) no agrega 90 días a la fecha, solo establece el día del mes en 90, por lo que establece la fecha en 90 de mayo de 2016. Mayo no tiene 90 días, por supuesto, para que se traduce al 59 de junio, que nuevamente ha pasado el final de junio, y luego se traduce al 29 de julio.

Si desea agregar días a una fecha, obtenga el día del mes de la fecha original, agregue 90 a eso, luego úselo en setDate().

var startDatePlusNinetyDays = convertedStartDate.setDate(convertedStartDate.getDate() + 90);
0
Barmar 13 may. 2016 a las 19:29

No creo que setDate() esté haciendo lo que tú piensas que es. De acuerdo con MDN, setDate ( ) establece el día del objeto Fecha en relación con el comienzo del mes establecido actualmente.

Pruebe algo como esto, tal vez:

Date.prototype.addDays = function(days){
    this.setDate(this.getDate() + days);
    return this;
};

var startDatePlusNinetyDays = convertedStartDate.addDays(90);
0
neilsimp1 13 may. 2016 a las 19:28

Al agregar fechas, puede considerar usar la siguiente convención, que difiere ligeramente de su enfoque actual:

// This will add a specific number of days to the existing date
function addDays(d, days) {
    var newDate = new Date();
    newDate.setDate(newDate.getDate() + days);
    return newDate;
}

Esto es diferente al uso de {{ X0}} solo que establece el día relativo al mes actual que se puede ver en este ejemplo y se muestra a continuación:

enter image description here

<!DOCTYPE html>
<html>

<head>
  <script src="https://code.jquery.com/jquery-2.1.4.js"></script>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS Bin</title>
</head>

<body>
  <table id='testing'>
    <tr>
      <th>Days Added</th>
      <th>Using setDate(days)</th>
      <th>Using setDate(getDate() + days)</th>
    </tr>
  </table>
  <script>
    $(function() {
      var start = "5/12/2016";
      for (var i = 1; i <= 90; i++) {
        // Using setDate() alone
        var setDate = new Date(new Date(start).setDate(i));
        // Using getDate() + i
        var getDate = addDays(new Date(start), i);
        // Add rows
        $("#testing").append('<tr><td>' + i + '</td><td>' + format(setDate) + '</td><td>' + format(getDate) + '</td></tr>');
      }

      // This will add a specific number of days to the existing date
      function addDays(d, days) {
        var newDate = new Date(d);
        newDate.setDate(newDate.getDate() + days);
        return newDate;
      }

      // Format for example purposes
      function format(d) {
        return (d.getMonth() + 1) + '/' + d.getDate() + '/' + d.getFullYear();
      }
    })
  </script>
</body>

</html>

Notará rápidamente que al agregar un solo día utilizando su método existente, el resultado es 5/1/2016 ya que establece el día para el primer día del mes en lugar de agregarlo a la fecha existente. Dado que está comenzando en 5/12/2016, eso indica que habrá una diferencia de aproximadamente 12 días entre los dos resultados en general, que es similar a lo que experimentó.

0
Rion Williams 13 may. 2016 a las 19:57

Cuando haces var startDatePlusNinetyDays = convertedStartDate.setDate(90); estás configurando la fecha en 90, no incrementando la fecha.

La razón por la que se incrementan 78 días es porque la fecha inicial fue 12 (como el 12 de mayo) y la está configurando en 90 de modo que 90 - 12 es 78 .

Tratar

var startDatePlusNinetyDays = new Date(+convertedStartDate + 24 * 3600000 * 90)

Que tomará la fecha de inicio convertida y agregará 90 días (en milisegundos)

0
arcyqwerty 13 may. 2016 a las 19:28