2009-07-02 10 views
5

Ich habe eine JavaScript-Funktion, die nach einem Datumsbereich sucht. Gibt es eine Möglichkeit zu überprüfen, ob ein Benutzer ein gültiges Datum in einem Textfeld eingegeben hat, unabhängig von Format?Wie kann ich überprüfen, ob der Benutzer ein gültiges Datum in Javascript übergibt?

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

Antwort

10

einen Blick auf diese Bibliothek date.js http://code.google.com/p/jqueryjs/source/browse/trunk/plugins/methods/date.js

es hat eine nützliche Funktion namens vonString, die versuchen, und einen String konvertieren (basierend auf Date.format) auf ein gültiges Datumsobjekt.

Die Funktion gibt false zurück, wenn sie kein gültiges Datumsobjekt erstellt - Sie können dann ein anderes Format ausprobieren, bevor Sie aufgeben, wenn alle falsch sind.

sind hier einige Beispiel-Formate Sie testen konnte:

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")); 

Josh

+0

Sofern der Benutzer das Format nicht angibt, haben Sie immer noch das Europa/US Ambiguitätsproblem. –

+0

@Matt - Korrekt - die einzige Lösung dafür ist zu testen, ob die Tage oder Monate größer als 12 sind - wenn nicht müssen Sie zurückgeben, dass das Datum mehrdeutig ist und sie sollten verwenden TT/MM/JJJJ – Josh

2

unabhängig vom Format?

, die heikel ...

  • 2009/07/02 sein wird, ist ein gültiges Datum
  • 02/07/09 auch
  • 2-7-09 auch
  • 02-7 -'09 auch
  • die zweite Juli 2009 -> auch gültig
  • twee Juli tweeduizend en negen -> auch gültig ist (niederländische Sprache)

Alle gültig, aber alle in einem anderen Format. Also, unabhängig von Format ... Ich bezweifle es ernst ...

1

Sie können reguläre Ausdrücke oder ein Maß Code. Beispiel unten:

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

Es ist ein furchtbar schwieriges Problem Daten in einem beliebigen Format zu analysieren (wie @Natrium weist darauf hin). Es ist noch verwirrender, wenn Sie bedenken, dass Europa ihre Daten als TT/MM/JJJJ schreibt, also können Sie nicht sagen, ob 2/7/09 der 7. Februar oder der 2. Juli ist.

Die meisten Menschen lösen dieses Problem, indem sie entweder einen datepicker Steuerungstyp aus einer JavaScript-Bibliothek verwenden oder Dropdown-Boxen mit festgelegten Werten für Monat, Tag und Jahr verwenden.

<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

Verwenden von Selects ist eine schreckliche Lösung. Jetzt, anstatt "27" für den Tag einzugeben, muss ich eine ganze Liste von Zahlen nach unten scrollen - der Pulldown öffnet sich auf den meisten Plattformen zu einem schmalen großen Rechteck, das schwer zu verwalten ist.Auf der anderen Seite, Sie nicht-Auswahl basierte Steuerelemente unterliegen Sie immer noch das Parsing-Problem. – levik

+1

Eigentlich, wenn Sie Tab auf das Auswahlfeld, dann geben Sie "2" und dann "7" wird es richtig auswählen "27." (Getestet mit Firefox). –

+0

+1 für einen Datepicker – jeroen

0

Ich weiß, ich muss eine Validierung auf den Code hinter sich haben. Das sind alles gute Antworten, aber es wurde langsam komplizierter. Ich wollte mich nicht in einer Ecke zurückhalten, also wähle ich die alternative Route. Danke

Verwandte Themen