2016-07-18 8 views
0

Leute,Javascript-Funktion zu überprüfen, zwei Datumsbereiche mit Date.UTC in allen Browsern funktioniert, aber Firefox

ich dies mit I Vorwort werde nicht viel Erfahrung Javascript. Ich habe versucht, einige clientseitige Überprüfungen beim Senden von Formularen durchzuführen, um zu verhindern, dass ein Benutzer einen Bericht ausführt, wenn sie einen Datumsbereich größer als ein Jahr eingeben, aber andernfalls lassen Sie ihn ausführen. Hier ist die Funktion

function revDays() { 

var _MS_PER_Day=24*60*60*1000; 

var startDate = new Date(document.getElementById('FROM').value); 
var sy = startDate.getUTCFullYear(); 
var sm = startDate.getUTCMonth(); 
var sd = startDate.getUTCDate(); 

var endDate = new Date(document.getElementById('TO').value); 
var ey = endDate.getUTCFullYear(); 
var em = endDate.getUTCMonth(); 
var ed = endDate.getUTCDate(); 

var utc1 = Date.UTC(sy, sm, sd); 
var utc2 = Date.UTC(ey, em, ed); 

//alert("utc1 variable is " + utc1); 
//alert("utc2 variable is " + utc2); 

var dayDiff = Math.floor(utc2 - utc1); 

//alert("dayDiff var is " + dayDiff); 

var diff = Math.floor((utc2 - utc1)/_MS_PER_Day); 

//alert("diff var is " + diff); 

if (diff > 365) { 
    alert("This report cannot be run for more than 365 days at a time. Please adjust your date range and try again"); 
    return false; 
    } 
else { 
    return true; 
    } 
}; 

Ich nenne diese Funktion auf Formular

<form name="Report" method="post" action="report.php" target="_blank" onsubmit="return revDays(this)"> 

einreichen Dies funktioniert wie erwartet in Chrome, IE und Safari, aber Firefox gibt NaN auf einem der Vars, sobald Sie das Hinzufügen starten in die Date.UTC-Funktionen. Sie können meine kommentiert out Warnungen sehen, wo ich in anderen Browsern verglichen, die Date.UTC richtig die Zeichenfolge in einem Date-Objekt in MS konvertiert, aber FireFox gibt einfach NaN trotz ihrer Dokumentation besagt, dass sie Date.UTC

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/UTC

unterstützen

Kann mir jemand in die richtige Richtung zeigen, was ich vermisse? Die ähnlichen Fragen, die ich in SO fand, waren über den Vergleich zweier Daten, und in diesem Fall muss ich die Anzahl der Tage zwischen zwei Werten erhalten, und nicht ein einfacher Boolescher Wert ist gleich zu überprüfen.

+0

Was sind die Werte dieser Elemente "FROM" und "TO"? – Adrian

+0

Ihr Problem ist hier: 'new Date (document.getElementById ('FROM'). Value);' Strings nicht mit dem Date-Konstruktor (oder Date.parse, sie sind äquivalent zum Parsen) zu analysieren, da es weitgehend implementierungsabhängig ist (wie du hast es entdeckt). Verwenden Sie eine kleine Parsing-Funktion (3 oder 4 Zeilen), wenn Sie nur ein Format oder eine Bibliothek anderweitig unterstützen müssen. – RobG

+0

PPS Erstellen eines Datums, dann verwenden seine UTC-Werte mit Date.UTC einfach einen Zeitwert für einen identischen Zeitpunkt (d. H. Es ist sinnlos). ;-) – RobG

Antwort

0

Ihre Frage kommt fast sicher aus:

new Date(document.getElementById('FROM').value); 

das Parsen eines Strings folgert das Date-Konstruktor verwenden. Das ist nie eine gute Idee, Sie sollten den Parser immer explizit auf das von Ihnen verwendete Format hinweisen. Der integrierte EMCAScript-Parser lässt das nicht zu, so dass er nur das Format erraten muss und es vielleicht richtig macht oder nicht.

Schreiben Sie also einen kleinen Parser für Ihr gewünschtes Format oder verwenden Sie eine Bibliothek, mit der Sie das Format angeben können. Ich gehe davon aus, dass es nur D/M/Y ist:

Unten ist ein einfacher Parser für D/M/Y-Format. Um nun festzustellen, ob zwei Daten mehr als 1 Jahr auseinanderliegen, können Sie einfach 1 Jahr zu dem früheren Datum hinzufügen und sehen, ob es größer als das spätere Datum ist. Wenn ja, ist es weniger als 1 Jahr vorher. Der einzige Trick ist der 29. Februar und ein Jahr gibt den 1. März, aber das wird nur sehr selten passieren.

Das folgende Beispiel validiert die Daten, zeigt Nachrichten an, wenn die Daten ungültig sind und bestimmt, ob die Daten mehr oder weniger als 1 Jahr auseinander liegen.

// Parse and validate date in format dd/mm/yyyy 
 
function parseDMY(s) { 
 
    var b = s.split(/\D/); 
 
    var d = new Date(b[2], --b[1], b[0]); 
 
    return d && d.getMonth() == b[1]? d : new Date(NaN); 
 
} 
 

 
// Check if d1 is less than or equal to 1 year after d0 
 
function checkRangeLessThanOneYear(d0, d1) { 
 
    return d0.setFullYear(d0.getFullYear() + 1) >= d1; 
 
} 
 

 
function checkRange(form) { 
 
    var d0 = parseDMY(form.startDate.value); 
 
    var d1 = parseDMY(form.endDate.value); 
 
    if (isNaN(d0.getTime())) { 
 
    alert('Start date is invalid'); 
 
    return; 
 
    } 
 
    if (isNaN(d1.getTime())) { 
 
    alert('End date is invalid'); 
 
    return; 
 
    } 
 
    alert(checkRangeLessThanOneYear(d0, d1)? 'All good' : 'Range more than 1 year'); 
 
}
<form onsubmit="checkRange(this); return false;"> 
 
    Start date (d/m/y)<input name="startDate"><br> 
 
    End date (d/m/y)<input name="endDate"><br> 
 
    <button>Check Dates</button> 
 
</form>

Verwandte Themen