18 Stimmen

Javascript Fügen Sie Zeit für ein zukünftiges Datum hinzu

Ich habe mir einige andere Fragen angesehen und mein spezifisches Problem nicht gesehen, also entschuldigen Sie bitte, falls es gefragt oder beantwortet wurde.

Was ich versuche zu tun, ist ein einfacher "Zahlungs"-Rechner zu erstellen und zusätzliche Informationen anzugeben, wie das Datum der ersten und letzten Zahlung.

In einigen Fällen funktioniert der Tag der letzten Zahlung und manchmal nicht.

Hier ist mein Code:

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;

Also nehme ich das Datum der ersten Zahlung und füge 1209600 Sekunden mal die Anzahl der Zahlungen hinzu (minus 1, da sie die erste Zahlung "bereits" geleistet haben).

Dies basiert auf dem Start an einem bestimmten Tag, der vom Benutzer gewählt werden kann.

Also mein Beispiel sind 156 BiWeekly-Zahlungen (also 155 für die Berechnungen), was 6 Jahre ergibt. Wenn ich den 1. wähle, erhalte ich den Start am 01.10.2013, aber das Ende am 11.09.2019 (Erster an einem Dienstag, letzter an einem Mittwoch).

Für den 15. (15.09.2013 - ein Sonntag - bis 24.08.2019 - ein Samstag) Für den 20. (20.09.2013 - ein Freitag - bis 29.08.2013 - ein Donnerstag)

Also, da es manchmal einen Tag später ist und manchmal einen Tag früher, kann ich nicht einfach +1 zu var dd = newDateObj.getDate(); hinzufügen.

Ich bin wirklich ratlos, was hier passiert, und ich hoffe, dass jemand da draußen entweder Erfahrung damit hat oder jemand, der weiß, was zum Teufel ich falsch mache.

Vielen Dank im Voraus für jegliche Hilfe, die Sie anbieten können.

23voto

RobG Punkte 133037

Wenn Sie eine Anzahl von Wochen hinzufügen möchten, fügen Sie einfach 7 mal so viele Tage hinzu, z.B.

var now = new Date();
// Füge zwei Wochen hinzu
now.setDate(now.getDate() + 14);

Also, wenn Sie 24 vierzehntägige Zahlungen haben:

var now = new Date();
// Füge 24 vierzehn Tage hinzu (48 Wochen)
now.setDate(now.getDate() + 24 * 14);

oder

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

was auch immer Sie für am klarsten halten.

Wenn Sie ein Start- und Enddatum haben möchten:

var start = new Date();
var end = new Date(+start);
end.setDate(end.getDate() + 24 * 14);

alert('Start am: ' + start + '.\n Ende nach 24 vierzehn Tagen: ' + end); 

Bearbeiten

Hier ist ein funktionierendes Beispiel:

function calcLastPayment(start, numPayments) {
  if (typeof start == 'string') {
    start = stringToDate(start);
  }

   var end = new Date(+start);
   end.setDate(end.getDate() + --numPayments * 14)
   return end;
 }

 // Erwartet Datum im US-Format m/d/j
 function stringToDate(s) {
   s = s.split(/\D/)
   return new Date(s[2], --s[0], s[1])
 }

   Geben Sie das Datum der ersten Zahlung ein (m/d/j):

   Geben Sie die Anzahl der Zahlungen ein:

Bei einem ersten Zahlungsdatum am Donnerstag, 5. September und 3 Ratenzahlungen gibt es den Donnerstag, 3. Oktober zurück, was für mich korrekt erscheint (5. und 19. September und 3. Oktober). Es sollte für jede Anzahl von Zahlungen funktionieren.

3voto

Ryan Taylor Punkte 10733

Es gibt eine einfache Möglichkeit, dies in einer oder zwei Zeilen Code zu tun.

Ich verwende 864e5 für die Anzahl der Millisekunden an einem Tag. Weil 1000 Millisekunden/Sekunde * 60 Sekunden/Minute * 60 Minuten/Stunde * 24 Stunden/Tag = 86400000 Millisekunden/Tag oder 864e5.

var jetzt = new Date,
    tag = 864e5,
    eineWocheVonJetzt = new Date( +jetzt + tag * 7); //+jetzt wandelt das Datum in einen ganzen Zahl um
  • +jetzt wandelt das Datum in eine ganzen Zahl um, die Anzahl der Millisekunden. jetzt.valueOf() funktioniert auch.
  • tag * 7 oder 864e5 * 7 ist die Anzahl der Millisekunden in einer Woche.
  • new Date(...) wandelt die Anzahl der Millisekunden wieder in ein Datum um.

Manchmal muss man sich keine Sorgen machen, den Wert wieder in ein Datum umzuwandeln.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X