He visto algunas otras preguntas, y no vea mi problema específico, así que por favor me disculpan si ya ha sido pedido o contestado.

Lo que estoy tratando de hacer es averiguar un simple «pago» de la calculadora, y proporcionar alguna información adicional, como la fecha del primer pago, y la última.

En algunos casos, el día del último pago de obras, y a veces no.

Aquí está mi código:

var myDate = new Date();

var odo = document.contract.firstPaymentDate.value;
var n = odo.split("/"); 
var month = n[0];
var day = n[1];
var year = n[2];

var oldDateObj = new Date(year, month, day);
var newDateObj = new Date(oldDateObj.getTime() + ((document.contract.totalNumberRegularPayments.value - 1)*1209600*1000));
var dd = newDateObj.getDate();
var mm = newDateObj.getMonth();
var y = newDateObj.getFullYear();

var someFormattedDate = mm + '/'+ dd + '/'+ y;
document.contract.lastPaymentDate.value = someFormattedDate;

Así que me tome la primera fecha de pago, y agregar 1209600 segundos multiplicado por el número de pagos (menos de 1, ya que tienen «ya que» pagó la primera).

Esto se basa en partir de un día determinado, que puede ser elegido por el usuario.

Así que mi ejemplo es de 156 pagos Quincenales (de modo 155 para los cálculos), que funciona a 6 años. Si puedo elegir la fecha de la 1ª, tengo 10/01/2013 como el inicio, pero 9/11/2019 como el final (por Primera vez en un martes, último un miércoles).

Para el día 15 (9/15/2013 – un domingo – a 8/24/2019 – sábado)
Para el 20 (9/20/2013 – viernes – a 8/29/2013 – un jueves)

Así ya que a veces es un día más tarde, y a veces con un día de anticipación, no puedo +1 a var dd = newDateObj.getDate();

Estoy realmente desconcertado en cuanto a lo que está pasando, y estoy esperando que alguien por ahí tiene alguna experiencia con esto, o alguien que sabe de qué diablos podría estar haciendo mal.

Gracias de antemano por cualquier ayuda que puede ofrecer.

  • Tenga en cuenta que los meses en JavaScript son cero indexado, por lo que new Date(year, --month, day) y var mm = newDateObj.getMonth() + 1. También, en lugar de oldDateObj.getTime() puedes usar +oldDateObj. Podría ser un poco confuso, aunque. Por último, sólo alrededor del 5% de la población mundial utiliza mes/día/año, así que asegúrese de que está claro que es el formato que usted espera y está presentando.
InformationsquelleAutor Will Sam | 2013-09-03

2 Comentarios

  1. 11

    Si desea agregar un número de semanas, sólo tiene que añadir 7 veces el número de días, por ejemplo,

    var now = new Date();
    //Add two weeks
    now.setDate(now.getDate() + 14);

    Así que si usted tiene 24 pagos quincenales:

    var now = new Date();
    //Add 24 fortnights (48 weeks)
    now.setDate(now.getDate() + 24 * 14);

    o

    now.setDate(now.getDate() + 24 * 2 * 7);

    lo que usted piensa que es más clara.

    Si quieres tener una fecha de inicio y fin:

    var start = new Date();
    var end = new Date(+start);
    end.setDate(end.getDate() + 24 * 14);
    
    alert('Start on: ' + start + '.\nEnd in 24 fortnights: ' + end); 

    Editar

    He aquí un ejemplo de trabajo:

    <script>
    
    function calcLastPayment(start, numPayments) {
      if (typeof start == 'string') {
        start = stringToDate(start);
      }
    
      var end = new Date(+start);
      end.setDate(end.getDate() + --numPayments * 14)
      return end;
    }
    
    //Expect date in US format m/d/y
    function stringToDate(s) {
      s = s.split(/\D/)
      return new Date(s[2], --s[0], s[1])
    }
    
    </script>
    
    <form>
     <table>
      <tr><td>Enter first payment date (m/d/y):
          <td><input name="start">
      <tr><td>Enter number of payments:
          <td><input name="numPayments">
      <tr><td colspan="2"><input type="button" value="Calc end date" onclick="
               this.form.end.value = calcLastPayment(this.form.start.value, this.form.numPayments.value)
               ">
      <tr><td>Last payment date:
          <td><input readonly name="end">
      <tr><td colspan="2"><input type="reset">
     </table>
    </form>

    Dado una primera fecha de pago el jueves, 5 de septiembre y el 3 de pagos devuelve el jueves 3 de octubre, lo que parece correcto para mí (5 y 19 de septiembre y 3 de octubre). Se debe trabajar para cualquier número de pagos.

    • Gracias, pero el primer pago no es siempre hoy. Siempre se establece de un cierto número de días, pero que todo depende de la fecha de inicio. A partir de hoy, las fechas de inicio disponibles son los que describí en mi pregunta. Así que dependiendo de lo que uno es tomado, he de averiguar la fecha de finalización. Me encantaría usar now, pero que no funcionan. ¿Tienes una sugerencia para configurar el inicio a la fecha de inicio calculada (que está funcionando bien)? Si es así, su último pedazo de código debería funcionar para mí.
    • Actualización de…el último bit de código no funciona. Termino con el +1 día o -1 día, dependiendo de la fecha de inicio. confundido
    • La estrategia es la misma. Crear un objeto Date (no importa cómo, su código está muy bien para eso), entonces sólo tiene que añadir 14 veces el número de quincenas a la fecha. Así que si el primer pago es de 3 de septiembre, el siguiente es 3 + 14 = 17 de septiembre, la siguiente es de 17 + 14 = 1 de octubre y así sucesivamente.
    • Saqué el botón, y se hizo la llamada a la función en el menú desplegable onChange, y también se ha cambiado la función: function calcLastPayment(start, numPayments) { if (typeof start == 'string') { start = stringToDate(start); } var end = new Date(+start); end.setDate(end.getDate() + --numPayments * 14) var dd = end.getDate(); var mm = end.getMonth() + 1; var y = end.getFullYear(); var someFormattedDate = mm + '/'+ dd + '/'+ y; //end.toString('MM/dd/yyyy'); return someFormattedDate; } y ahora me aparece el formato de fecha de devolución correctamente. GRACIAS!
  2. 0

    Hay una manera simple de hacer esto en una o dos líneas de código.

    Yo uso 864e5 para el número de milisegundos en un día. Porque 1000 milliseconds/second * 60 seconds/minute * 60 minutes/hour * 24 hours/day = 86400000 milliseconds/day o 864e5.

    var now = new Date,
        day = 864e5,
        weekFromNow = new Date(+now + day * 7); //+now casts the date to an integer
    • +now proyecta la fecha a un número entero, el número de milisegundos. now.valueOf() también funciona.
    • day * 7 o 864e5 * 7 es el número de milisegundos en una semana.
    • new Date(...) arroja el número de milisegundos a una fecha de nuevo.

    A veces usted no tiene que preocuparse acerca de fundición el valor a una fecha.

Dejar respuesta

Please enter your comment!
Please enter your name here