2017-06-02 4 views
1

Ich möchte Datum Argument überprüfen, nachdem Benutzer das Formular übermittelt. Meine App läuft auf ColdFusion 9 und es gibt nur wenige eingebaute Funktionen wie isDate(), aber diese Funktion wird auch für einige funky Datumswerte True zurückgegeben. Ich habe mich diesem Weg genähert, um mein Datumsargument zu validieren:ColdFusion 9 Datumsvalidierung?

<cfarguments name="myDate" type="string" required="true"> 
<cfset getMonth = Month(myDate)> 
<cfset getDay = Day(myDate)> 
<cfset getYear = Year(myDate)> 

<cfif getMonth LT 1 OR getMonth GT 12> 
    <cfset message = "Month value should be in a range between 1 and 12."> 
<cfelseif getDay LT 1 OR getDay GT 31> 
    <cfset message = "Day value should be in a range btween 1 and 31."> 
<cfelseif ((getMonth EQ 4 OR getMonth EQ 6 OR getMonth EQ 9 OR getMonth EQ 11) AND getDay EQ 31)> 
    <cfset message = "Month of April, June, September and November have 30 days."> 
<cfelseif getMonth EQ 2> 
    <cfset isLeap = (getYear MOD 4 AND (getYear MOD 100 NEQ 0 OR getYear MOD 400 EQ 0))> 

    <cfif (getDay GT 29 OR (getDay EQ 29 AND NOT isLeap))> 
     <cfset message = "Only leap year can have 29 days."> 
    </cfif> 
</cfif> 

Ich frage mich, ob diese Weise, Datum zu validieren irgendwelche Probleme hat? Ich habe versucht, das Datum auf Tag, Monat und Jahr aufzuteilen. Dann überprüfte ich jeden, ob er im richtigen Bereich ist. Ich bin mir nicht sicher, ob es noch etwas gibt, nach dem ich suchen sollte. Ich verwende US-Datumsformat MM/TT/JJJJ in meiner App. Wenn jemand irgendwelche Vorschläge hat, lass es mich wissen. Vielen Dank.

+2

Sie erlauben die freie Eingabe eines Datums? Wenn ja, würde ich vorschlagen, stattdessen eine Datumsauswahl zu verwenden. Moment.js (http://momentjs.com/) ist ziemlich gut und einfach zu implementieren. Daten waren lange Zeit der Fluch meiner Existenz, und wenn Sie dem Benutzer die Möglichkeit nehmen, Ihnen die Interpretation eines Datums zu senden und sie zu zwingen, Ihnen Ihre Interpretation zu schicken, werden Sie ein glücklicherer CAMPER sein. – Shawn

+0

Es tut uns leid. http://makingsense.github.io/moment-datepicker/ ist ein guter Datepicker, der momentjs verwendet. Moment.js wird für die Überprüfung und Formatierung verwendet. – Shawn

+0

Aber andererseits, gibt es Leute wie mich, die jede Form betrachten, die nicht mit nur einer Tastatur abgeschlossen werden kann, um crapware zu sein. –

Antwort

1

Hier ist noch etwas, das Sie auf der Serverseite überprüfen sollten. Dieser Code:

writeoutput (dateformat("Apr 31", "yyyy-mm-dd")); 

gibt 1931-04-01 zurück. Das ist ein perfekt gültiges Datum, das jeden Test in Ihrer Frage besteht. Was Sie dagegen tun, hängt davon ab, ob das Jahr 1931 für Ihre Bewerbung gültig ist oder nicht.

Wenn Sie einen Wert wie "fred" eingeben, wird Ihr erster Befehl <cfset getMonth = Month(myDate)> einen Fehler ausgeben. Das macht den Rest von dem, was Sie versuchen, unnötig.

Dinge, die Sie berücksichtigen sind:

  • Kalenderwerkzeug anstelle von Textboxen in Ihrem Formular.
  • Verwenden Sie <cfinput mask="something"> in Ihrem Formular. Wohlgemerkt, diese Option ist ärgerlich
    wenn Sie das Feld vorbelegen.
  • Javascript Validierung, wenn Absenden des Formulars
  • ein maxlength Attribut in Ihrem Input-Tag
  • Anweisungen auf dem Formular

persönlich verwende ich eine Kombination von Anweisungen, die Eingänge vorgebevölkern, <cfinput validate="date">, und einige benutzerdefinierte Tags, die ich vor einigen Jahren geschrieben habe, verwenden einfach isDate(). Es ist nicht perfekt, aber es macht den Job erledigt.

+0

Was ist mit isValid ("USDate", myDate)? Ich habe diese Funktion getestet und scheint in Ordnung zu sein. Ich habe versucht, 29 Tage für Februar für das Jahr einzugeben, das kein Sprung ist, und das wurde auch als falsch angezeigt. –

+0

Ja, es ist sinnlos, month(), day() oder year() zu verwenden, weil sie das Gleiche tun wie IsDate() dh Konvertiere das Datum * string * in ein Datum (mit bester Schätzung), damit sie das haben gleiche Probleme. Wenn die Eingabe * immer * im Format MM/TT/JJJJ erfolgen muss, teilen Sie die Zeichenfolge am Trennzeichen einfach auf und verwenden Sie createDate(), um eine Ausnahme zu fangen? – Leigh