2016-02-16 9 views
8

Ich habe 2 Felder Eingabe- und Ausgabedaten. Unter bestimmten Bedingungen habe ich das endDate auf 1 Jahr vor dem Startdatum gesetzt.Eingestellter Wert des Eingabetyps Datumsfehler

<input type='date' id='endDate'> 
$("#startDate").change(function(){ 
    var endDate = new Date($("#startDate").val()); 
    endDate.setMonth(endDate.getMonth() + 1); 
    endDate.setFullYear(endDate.getFullYear() + 1); 
    var myDay = ("0" + endDate.getDate()).slice(-2); 
    var myMonth = ("0" + endDate.getMonth()).slice(-2); 
    $("#endDate").val(endDate.getFullYear() + '-' + myMonth + '-' + myDay); 
} 

Das Problem, wenn ich das Startdatum 2016.02.29 gesetzt bekam ich folgende Fehlermeldung:

The specified value "2017-02-29" does not conform to the required format, "yyyy-MM-dd".

ich die Funktion Date() erwartet von sich darum zu kümmern . Anscheinend tun sie das nicht. Ist das ein Fehler?

Ist ihre sowieso schneller als das Hinzufügen einer Reihe von wenn Aussagen?

Antwort

7

Das eigentliche Problem hier ist, dass Sie den Wert getMonth verwendet haben, ohne 1 hinzuzufügen. Der Wert von getMonth beginnt bei 0 (Januar), aber Monat Werte in Ihrem yyyy-MM-dd Format mit 1.

starten Also:

var myMonth = ("0" + (endDate.getMonth() + 1)).slice(-2); 
// Note -------------^------------------^^^^^ 

Das ist, wie Sie mit einer ungültigen Zeichenfolge endete, 2017-02-29 trotz genutzt haben Das Date Objekt, das tatsächlich sicherstellen wird, dass es nur gültige Daten gibt. Das Objekt Date enthielt das Datum März 29., nicht 29. Februar.

jedoch:

On certain conditions I set the endDate to be 1 year ahead of start date.

Ihr Code macht das nicht.Es fügt ein Jahr und einen Monat, nicht nur ein Jahr:

endDate.setMonth(endDate.getMonth() + 1);  // <== Changing month 
endDate.setFullYear(endDate.getFullYear() + 1); 

Wenn Sie nur ein Jahr hinzufügen möchten, entfernen Sie die erste dieser beiden Linien. Das, zusammen mit der Korrektur, wie Sie getMonth verwenden, wenn Sie die Zeichenfolge bilden, wird zuverlässig ein Jahr zu dem Datum (mit möglichem Monat Rollover) hinzufügen.

So:

$("#startDate").change(function(){ 
    var endDate = new Date($("#startDate").val()); 
    endDate.setFullYear(endDate.getFullYear() + 1); 
    var myDay = ("0" + endDate.getDate()).slice(-2); 
    var myMonth = ("0" + (endDate.getMonth() + 1)).slice(-2); 
    $("#endDate").val(endDate.getFullYear() + '-' + myMonth + '-' + myDay); 
}); 
10

The specified value "2017-02-29" does not conform to the required format, "yyyy-MM-dd".

2017-02-29 ist kein gültiges Datum. 29th feb des nächsten Jahres (2017) ist nicht möglich.

Nur Schaltjahre haben Februar Monat von 29.

Versuchen 2016-02-29 statt.

Is their anyway faster than adding a bunch of if statements?

Keine Notwendigkeit Bündel hinzufügen von if-Anweisungen können Sie diese answer

können
function leapYear(year) 
{ 
    return ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0); 
} 

Für Ihre Frage zu beantworten, wenn Sie das Datum explizit wie „2017.02.29“ gesetzt, dann wird es einen Fehler werfen

So stellen Sie Änderungen in dem Date-Objekt selbst und anwenden, das Date-Objekt mit dem Eingang von

$("#endDate").val(endDate.toJSON().slice(0,10)); 

Nun sollte es zum nächsten Monat überrollen kümmern.

Edit (basierend auf TJ Kommentar)

Schaltjahre treten jedes Jahr, die von 4, außer diejenigen, durch 100 teilbaren (die nicht in Schaltjahren), außer diejenigen, teilbar durch 400 (die gleichmäßig teilbar ist sind Schaltjahre).

+2

Sie mein #RESPECT gewonnen;) Vielleicht OP braucht eine 'if' Zustand .. – Rayon

+1

Schaltjahre auftreten jedes Jahr, die von 4 * außer * diejenigen gleichmäßig durch 100 teilbar teilbar ist (die keine Schaltjahre sind), * ausgenommen * Einsen, die durch 400 teilbar sind (welche * Schaltjahre sind). –

+1

Ja, ich weiß, dass dies ein Problem der Schaltjahre ist. Aber meine Frage ist, sollte sich die Date() Funktion nicht darum kümmern? Oder sollte ich es manuell machen? –

Verwandte Themen