2017-06-02 35 views
1

ユーザーがフォームを送信した後、日付の引数を検証したいと思います。私のアプリケーションはColdFusion 9で動作しており、isDate()のような組み込み関数はほとんどありませんが、この関数はいくつかのファンキーな日付値であってもtrueを返します。日付を検証するために、この方法はすべての問題を持っている場合、私は思ったんだけどColdFusion 9日付検証?

<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> 

:私は私の日付の引数を検証するため、このように近づいてきましたか?私は日付を日、月、年に分割しようとしました。それから私はそれが正しい範囲にあるかどうかそれぞれをチェックしていました。私が探しているべきことが他にあるかどうかはわかりません。私は私のアプリで米国の日付形式mm/dd/yyyyを使用しています。誰かが何か提案があれば教えてください。ありがとうございました。

+2

日付の自由形式の入力を許可していますか?もしそうなら、代わりに日付ピッカーを使うことをお勧めします。 Moment.js(http://momentjs.com/)はかなり優れていて実装が簡単です。日付は非常に長い間私の存在の悩みになっています。あなたが日付の解釈をあなたに送って、あなたにあなたの解釈を送るようにユーザーの能力を奪うならば、あなたはもっと幸せなキャンピングカーになるでしょう。 – Shawn

+0

ごめんなさい。 http://makingsense.github.io/moment-datepicker/は、momentjを使用する優れたdatepickerです。 Moment.jsは、検証と書式設定に使用されます。 – Shawn

+0

しかし、もう一度、私のような人は、キーボードだけを使用してクラップウェアとして完成できないフォームを考えています。 –

答えて

1

ここでは、サーバー側で確認する必要があります。このコード:

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

1931-04-01を返します。これはあなたの質問のすべてのテストに合格する完全に有効な日付です。それについては、1931年があなたのアプリケーションに有効かどうかによって異なります。

「fred」のような値が送信された場合、最初のコマンド<cfset getMonth = Month(myDate)>がエラーを送出することがあります。そのようなことは、あなたが試みていることの残りを不要にします。あなたが考えるかもしれません

物事は以下のとおりです。代わりに、フォーム内のテキストボックスのdatepickersを使用して

  • あなたのフォームに<cfinput mask="something">を使用してください。気になるのは、このフィールドをあらかじめ入力しておけば、このオプションは厄介なものです。
  • javascriptの検証フォームを送信する際
  • ご入力タグにMAXLENGTH属性フォーム上
  • 指示
  • 個人的に

私は、指示、入力を事前移入、<cfinput validate="date">の組み合わせを使用して、いくつかの私が数年前に書いたカスタムタグは、単にisDate()を使うだけです。それは完璧ではありませんが、仕事は終わります。

+0

isValid( "USDate"、myDate)はどうですか?私はこの機能をテストして、これまでのところよく見えます。私は閏年ではない2月29日に入ろうとしましたが、それは偽にも示されました。 –

+0

はい、IsDate()と同じことをするので、month()、day()、year()を使用するのは意味がありません。つまり、日付*文字列*を日付に変換して(ベスト推測を使用して)同じ問題。入力が*常に* mm/dd/yyyy形式でなければならない場合は、文字列を区切り文字に分割してcreateDate()を使用して例外をキャッチしてみませんか? – Leigh