簡體   English   中英

如何檢查用戶是否在javascript中傳遞了有效日期?

[英]How can I check if user passes a valid date in 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");
            }
}

看看這個庫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"));

玩笑

以任意格式解析日期是一個非常棘手的問題(如@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>

不管格式如何?

這將是棘手的......

  • 2009/07/02是有效日期
  • 02/07/09也
  • 2-7-09也
  • 02-7 -'09也
  • 2009年7月2日 - >也有效
  • twee juli tweeduizend en negen - >也有效(荷蘭語)

全部有效,但都有不同的格式。 所以,無論格式如何......我都很懷疑......

您可以使用正則表達式或自定義代碼。 示例如下:

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

我意識到我必須對后面的代碼進行驗證。 這些都是很好的答案,但開始變得復雜。 我不想在角落里支持自己,所以我選擇了替代路線。 謝謝

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM