2009-07-02 5 views
5

私は、日付範囲をチェックするjavascript関数を持っています。形式に関係なく、ユーザーがテキストボックスに有効な日付を入力したかどうかを確認する方法はありますか?ユーザーが有効な日付をjavascriptで渡すかどうかを確認するにはどうすればよいですか?

function checkEnteredDate() { 
      var inputDate = document.getElementById('txtDate'); 
      //if statement to check for valid date 
      var formatDate = new Date(inputDate.value); 
      if (formatDate > TodayDate) { 
       alert("You cannot select a date later than today."); 
       inputDate.value = TodayDate.format("MM/dd/yyyy"); 
      } 
} 

答えて

10

は、このライブラリのdate.js http://code.google.com/p/jqueryjs/source/browse/trunk/plugins/methods/date.js

を見て、それは便利な関数は、文字列を試してみて、変換しますをfromString を呼びかけています(Date.formatに基づいて)有効な日付オブジェクトに変換します。

この関数は、有効な日付オブジェクトを作成しないとfalseを返します。そうすれば、すべてがfalseを返す場合は、別の形式を試すことができます。

はここにあなたがテストすることができ、いくつかの例形式です:

Date.format = 'dd mmm yyyy'; 
alert(Date.fromString("26 Jun 2009")); 

Date.format = 'mmm dd yyyy'; 
alert(Date.fromString("Jun 26 2009")); 

Date.format = 'dd/mm/yy'; 
alert(Date.fromString("26/06/09")); 

Date.format = 'mm/dd/yy'; 
alert(Date.fromString("06/26/09")); 

Date.format = 'yyyy-mm-dd'; 
alert(Date.fromString("2009-06-26")); 

ジョシュ

+0

ユーザーがフォーマットを指定しない限り、ユーロ/ USのあいまいさの問題があります。 –

+0

@Matt - 正しい - 唯一の解決策は、日数または月数が12より大きいかどうかをテストすることです - 返さなければ日付があいまいでdd/mm/yyyyを使用する必要があります – Josh

2

フォーマットに関係なく?トリッキーになります

...

  • 2009年7月2日には、有効な日付もまた
  • 2-7-09
  • 02-7
  • 02/07/09です-'09も
  • 2009年7月の第二 - >も有効な
  • 灰汁抜けのしたジュリtweeduizend negenエン - >も有効(オランダ語)

すべてが有効ですが、すべてが異なる形式です。だから、フォーマットに関係なく...私は真剣にそれを疑う...

1

することはでき正規表現またはカスタムメイドのコード。以下の例は:

function isValidDate(dateStr, format) { 
    if (format == null) { format = "MDY"; } 
    format = format.toUpperCase(); 
    if (format.length != 3) { format = "MDY"; } 
    if ((format.indexOf("M") == -1) || (format.indexOf("D") == -1) || _ 
     (format.indexOf("Y") == -1)) { format = "MDY"; } 
    if (format.substring(0, 1) == "Y") { // If the year is first 
     var reg1 = /^\d{2}(\-|\/|\.)\d{1,2}\1\d{1,2}$/ 
     var reg2 = /^\d{4}(\-|\/|\.)\d{1,2}\1\d{1,2}$/ 
    } else if (format.substring(1, 2) == "Y") { // If the year is second 
     var reg1 = /^\d{1,2}(\-|\/|\.)\d{2}\1\d{1,2}$/ 
     var reg2 = /^\d{1,2}(\-|\/|\.)\d{4}\1\d{1,2}$/ 
    } else { // The year must be third 
     var reg1 = /^\d{1,2}(\-|\/|\.)\d{1,2}\1\d{2}$/ 
     var reg2 = /^\d{1,2}(\-|\/|\.)\d{1,2}\1\d{4}$/ 
    } 
    // If it doesn't conform to the right format (with either a 2 digit year or 4 digit year), fail 
    if ((reg1.test(dateStr) == false) && (reg2.test(dateStr) == false)) { return false; } 
    var parts = dateStr.split(RegExp.$1); // Split into 3 parts based on what the divider was 
    // Check to see if the 3 parts end up making a valid date 
    if (format.substring(0, 1) == "M") { var mm = parts[0]; } else _ 
     if (format.substring(1, 2) == "M") { var mm = parts[1]; } else { var mm = parts[2]; } 
    if (format.substring(0, 1) == "D") { var dd = parts[0]; } else _ 
     if (format.substring(1, 2) == "D") { var dd = parts[1]; } else { var dd = parts[2]; } 
    if (format.substring(0, 1) == "Y") { var yy = parts[0]; } else _ 
     if (format.substring(1, 2) == "Y") { var yy = parts[1]; } else { var yy = parts[2]; } 
    if (parseFloat(yy) <= 50) { yy = (parseFloat(yy) + 2000).toString(); } 
    if (parseFloat(yy) <= 99) { yy = (parseFloat(yy) + 1900).toString(); } 
    var dt = new Date(parseFloat(yy), parseFloat(mm)-1, parseFloat(dd), 0, 0, 0, 0); 
    if (parseFloat(dd) != dt.getDate()) { return false; } 
    if (parseFloat(mm)-1 != dt.getMonth()) { return false; } 
    return true; 
} 
4

(@Natriumが指摘するように)任意の形式の日付を解析するひどく難しい問題です。ヨーロッパがdd/mm/yyyyとして日付を書いていると考えると、さらに混乱します.2/7/09が2月7日か7月2日かどうかはわかりません。

ほとんどの人は、JavaScriptライブラリのdatepickerタイプのコントロールを使用するか、月、日、年の設定値を持つドロップダウンボックスを使用してこの問題に取り組んでいます。

<select name="month"> 
<option value="1">January</option> 
<option value="2">February</option> 
... 
<option value="12">December</option> 
</select> 

<select name="day"> 
<option value="1">1</option> 
<option value="2">2</option> 
... 
<option value="31">31</option> 
</select> 

<select name="year"> 
<option value="2000">2000</option> 
<option value="2001">2001</option> 
... 
<option value="2009">2009</option> 
</select> 
+0

選択を使用するのはひどいです溶液。今では「27」と入力する代わりに、数字のリスト全体をスクロールする必要があります。プルダウンは、ほとんどのプラットフォームでは管理が難しい狭い矩形になります。一方、非選択ベースのコントロールを使用すると、解析の問題が発生します。 – levik

+1

実際には、選択フィールドに移動して「2」と入力して「7」と入力すると、「27」が正しく選択されます。 (firefoxを使ってテスト済み)。 –

+0

+1 datepickerの場合 – jeroen

0

私はコードの背後にある検証を取得する必要があります実現する。これらはすべて良い答えですが、複雑になり始めています。私は代わりのルートを選ぶのでコーナーに自分自身を戻したいと思っていませんでした。ありがとう

関連する問題