Wie überprüfe ich das Datum mit dem Format "MM / TT / JJJJ" in JavaScript?

106

Ich möchte das Datumsformat für eine Eingabe mithilfe des Formats überprüfen mm/dd/yyyy.

Ich habe die folgenden Codes auf einer Site gefunden und dann verwendet, aber es funktioniert nicht:

function isDate(ExpiryDate) { 
    var objDate,  // date object initialized from the ExpiryDate string 
        mSeconds, // ExpiryDate in milliseconds 
        day,      // day 
        month,    // month 
        year;     // year 
    // date length should be 10 characters (no more no less) 
    if (ExpiryDate.length !== 10) { 
        return false; 
    } 
    // third and sixth character should be '/' 
    if (ExpiryDate.substring(2, 3) !== '/' || ExpiryDate.substring(5, 6) !== '/') { 
        return false; 
    } 
    // extract month, day and year from the ExpiryDate (expected format is mm/dd/yyyy) 
    // subtraction will cast variables to integer implicitly (needed 
    // for !== comparing) 
    month = ExpiryDate.substring(0, 2) - 1; // because months in JS start from 0 
    day = ExpiryDate.substring(3, 5) - 0; 
    year = ExpiryDate.substring(6, 10) - 0; 
    // test year range 
    if (year < 1000 || year > 3000) { 
        return false; 
    } 
    // convert ExpiryDate to milliseconds 
    mSeconds = (new Date(year, month, day)).getTime(); 
    // initialize Date() object from calculated milliseconds 
    objDate = new Date(); 
    objDate.setTime(mSeconds); 
    // compare input date and parts from Date() object 
    // if difference exists then date isn't valid 
    if (objDate.getFullYear() !== year || 
        objDate.getMonth() !== month || 
        objDate.getDate() !== day) { 
        return false; 
    } 
    // otherwise return true 
    return true; 
}

function checkDate(){ 
    // define date string to test 
    var ExpiryDate = document.getElementById(' ExpiryDate').value; 
    // check date and print message 
    if (isDate(ExpiryDate)) { 
        alert('OK'); 
    } 
    else { 
        alert('Invalid date format!'); 
    } 
}

Irgendwelche Vorschläge, was falsch sein könnte?

matt
quelle
3
Willkommen bei StackOverflow. Sie können den Quellcode mit der {}Symbolleistenschaltfläche formatieren . Diesmal habe ich es für dich getan. Versuchen Sie auch, einige Informationen zu Ihrem Problem bereitzustellen: Eine Beschreibung, die nicht funktioniert, ist hilfreich, um das Problem zu beheben .
Álvaro González
Welche Datumsformate möchten Sie validieren? Können Sie ein Beispiel für Daten nennen, die gültig sein sollten?
Niklas
manishprajapati.in/blog/…
Manish Prajapati

Antworten:

187

Ich denke, Niklas hat die richtige Antwort auf Ihr Problem. Außerdem denke ich, dass die folgende Datumsüberprüfungsfunktion etwas einfacher zu lesen ist:

// Validates that the input string is a valid date formatted as "mm/dd/yyyy"
function isValidDate(dateString)
{
    // First check for the pattern
    if(!/^\d{1,2}\/\d{1,2}\/\d{4}$/.test(dateString))
        return false;

    // Parse the date parts to integers
    var parts = dateString.split("/");
    var day = parseInt(parts[1], 10);
    var month = parseInt(parts[0], 10);
    var year = parseInt(parts[2], 10);

    // Check the ranges of month and year
    if(year < 1000 || year > 3000 || month == 0 || month > 12)
        return false;

    var monthLength = [ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ];

    // Adjust for leap years
    if(year % 400 == 0 || (year % 100 != 0 && year % 4 == 0))
        monthLength[1] = 29;

    // Check the range of the day
    return day > 0 && day <= monthLength[month - 1];
};
Elian Ebbing
quelle
9
Denken Sie daran, das zweite Argument zu verwenden, um: zu analysieren : parseInt(parts[0], 10). Andernfalls wird der September 09als Oktal gelesen und auf 0 analysiert
hugomg
1
Ein paar Jahre später hat mir das ein bisschen Zeit gespart, danke für die süße Antwort!
PsychoMantis
1
Ausgezeichnete Post! Kombiniert die Regex-Formatierung mit der für die Validierung erforderlichen Analyse.
James Drinkard
4
Ich würde vorschlagen, dass Sie den regulären Ausdruck folgendermaßen ändern: / ^ (\ d {2} | \ d {1}) \ / (\ d {2} | \ d {1}) \ / \ d {4} $ / this Art und Weise fängt es einen einstelligen Monat und Tag 05.01.2014. Danke für das Beispiel!
Mitch Labrador
1
Dies ist die kompakteste, effizienteste und eleganteste Antwort. Dies sollte die akzeptierte sein
Zorgatone
121

Ich würde Moment.js für die Datumsüberprüfung verwenden .

alert(moment("05/22/2012", 'MM/DD/YYYY',true).isValid()); //true

Jsfiddle: http://jsfiddle.net/q8y9nbu5/

trueWert ist für strikte Analyse Kredit an @Andrey Prokhorov, was bedeutet

Sie können einen Booleschen Wert für das letzte Argument angeben, damit Moment eine strikte Analyse verwendet. Für eine strikte Analyse müssen Format und Eingabe einschließlich der Trennzeichen genau übereinstimmen.

Razan Paul
quelle
22
+1 Ich muss dies unbedingt als die einzig äußerst korrekte Antwort unter allen eingereichten Beiträgen unterstützen! Sie möchten NICHT etwas so Komplexes wie das Parsen von Datumsangaben selbst durchführen!
Theodore R. Smith
5
Verwenden Sie "M / T / JJJJ", um 1-2 Ziffern für Monat und Tag zuzulassen.
James in Indy
3
Gut zu wissen, dass der dritte Parameter "true" für "use strict parsing" momentjs.com/docs/#/parsing/string-format
Andrey Prokhorov
@ Razan Paul hoffe es hat dir nichts ausgemacht Ich habe wenig Erklärung für mehr Klarheit hinzugefügt. Es ist ratsam, die Räder nicht immer wieder neu zu erfinden, daher ist Puals Antwort meiner bescheidenen Meinung nach die beste
Kick Buttowski
moment (dateString, 'MM / TT / JJJJ', true) .isValid () || moment (dateString, 'M / TT / JJJJ', true) .isValid () || moment (dateString, 'MM / D / YYYY', true) .isValid ();
Yoav Schniederman
43

Verwenden Sie zur Validierung den folgenden regulären Ausdruck:

var date_regex = /^(0[1-9]|1[0-2])\/(0[1-9]|1\d|2\d|3[01])\/(19|20)\d{2}$/;
if (!(date_regex.test(testDate))) {
    return false;
}

Dies funktioniert für mich für MM / TT / JJJJ.

Ravi Kant
quelle
3
Wie wir JJJJ-MM-TT oder ungültiges Datum wie 9834-66-43
Sandeep Singh
7
Sie können / ^ [0-9] {4} - (0 [1-9] | 1 [0-2]) - (0 [1-9] | [1-2] [0-9] | 3 verwenden [0-1]) $ / zur Validierung von JJJJ-MM-TT.
Ravi Kant
2
Das ist großartig, da ich es hasse, Regex zu formulieren und zwei ihre Effizienz zu mögen!
Jadrake
5
Was passiert im Jahr 3000? :) :)
TheOne
4
@ TheOne..y3k Problem ..: P
Sathesh
29

Alle Credits gehen an elian-ebbing

Nur für die Faulen hier biete ich auch eine angepasste Version der Funktion für das Format an biete JJJJ-MM-TT an .

function isValidDate(dateString)
{
    // First check for the pattern
    var regex_date = /^\d{4}\-\d{1,2}\-\d{1,2}$/;

    if(!regex_date.test(dateString))
    {
        return false;
    }

    // Parse the date parts to integers
    var parts   = dateString.split("-");
    var day     = parseInt(parts[2], 10);
    var month   = parseInt(parts[1], 10);
    var year    = parseInt(parts[0], 10);

    // Check the ranges of month and year
    if(year < 1000 || year > 3000 || month == 0 || month > 12)
    {
        return false;
    }

    var monthLength = [ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ];

    // Adjust for leap years
    if(year % 400 == 0 || (year % 100 != 0 && year % 4 == 0))
    {
        monthLength[1] = 29;
    }

    // Check the range of the day
    return day > 0 && day <= monthLength[month - 1];
}
Matija
quelle
Dies bestätigt '2020-5-1' als wahr, während die führenden Nullen ignoriert werden. Ich habe es geschafft, indem ich zuerst das Muster des Jahres mit /^(19|20)\d\d$/, des Monats mit /^(0[0-9]|1[0-2])$/und des Tages mit /^(0[1-9]|[12][0-9]|3[01])$/vor dem Parsen getestet habe . Dann hat es geklappt danke.
Hmerman6006
Um das Datumsmuster auch für das genaue Format JJJJ-MM-TT zu testen, überprüft dieser /^\d{4}\-\d{1,2}\-\d{1,2}$/reguläre Ausdruck JJJJ-MM-TT oder JJJJ-MD als wahr, daher wird nur die Länge und nicht jedes einzelne Datumsteil überprüft. Verwenden Sie /^\d{4}\-\d{2}\-\d{2}$/stattdessen die genaue Länge von JJJJ-MM-TT, ohne zu überprüfen, ob Jahr, Monat und Datum korrekt sind .
Hmerman6006
17

Du könntest benutzen Date.parse()

Sie können in der MDN-Dokumentation lesen

Die Date.parse () -Methode analysiert eine Zeichenfolgendarstellung eines Datums und gibt die Anzahl der Millisekunden seit dem 1. Januar 1970, 00:00:00 UTC oder NaN zurück, wenn die Zeichenfolge nicht erkannt wird oder in einigen Fällen unzulässige Datumswerte enthält (zB 31.02.2015).

Und prüfen Sie, ob das Ergebnis von Date.parseisNaN ist

let isValidDate = Date.parse('01/29/1980');

if (isNaN(isValidDate)) {
  // when is not valid date logic

  return false;
}

// when is valid date logic

Bitte schauen Sie nach, wann die Verwendung Date.parsein MDN empfohlen wird

Mario
quelle
1
Date.parse gibt Ihnen eine gültige Analyse mit einem Datum wie "46/7/17"
LarryBud
Wird wahres Ergebnis für JJJJ / 02/30
Raimonds
11

Es scheint für Daten im Format MM / TT / JJJJ gut zu funktionieren, Beispiel:

http://jsfiddle.net/niklasvh/xfrLm/

Das einzige Problem, das ich mit Ihrem Code hatte, war die Tatsache, dass:

var ExpiryDate = document.getElementById(' ExpiryDate').value;

Hatte ein Leerzeichen in den Klammern vor der Element-ID. Geändert zu:

var ExpiryDate = document.getElementById('ExpiryDate').value;

Ohne weitere Details bezüglich der Art der Daten, die nicht funktionieren, gibt es nicht viel anderes, zu dem man Eingaben machen kann.

Niklas
quelle
9

Die Funktion gibt true zurück, wenn die angegebene Zeichenfolge das richtige Format hat ('MM / TT / JJJJ'), andernfalls wird false zurückgegeben. (Ich habe diesen Code online gefunden und ein wenig geändert)

function isValidDate(date) {
    var temp = date.split('/');
    var d = new Date(temp[2] + '/' + temp[0] + '/' + temp[1]);
    return (d && (d.getMonth() + 1) == temp[0] && d.getDate() == Number(temp[1]) && d.getFullYear() == Number(temp[2]));
}

console.log(isValidDate('02/28/2015'));
            

Ganesh
quelle
4

Hier ist ein Ausschnitt, um das gültige Datum zu überprüfen:

function validateDate(dateStr) {
   const regExp = /^(\d\d?)\/(\d\d?)\/(\d{4})$/;
   let matches = dateStr.match(regExp);
   let isValid = matches;
   let maxDate = [0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
   
   if (matches) {
     const month = parseInt(matches[1]);
     const date = parseInt(matches[2]);
     const year = parseInt(matches[3]);
     
     isValid = month <= 12 && month > 0;
     isValid &= date <= maxDate[month] && date > 0;
     
     const leapYear = (year % 400 == 0)
        || (year % 4 == 0 && year % 100 != 0);
     isValid &= month != 2 || leapYear || date <= 28; 
   }
   
   return isValid
}

console.log(['1/1/2017', '01/1/2017', '1/01/2017', '01/01/2017', '13/12/2017', '13/13/2017', '12/35/2017'].map(validateDate));

Daniel Tran
quelle
3

Es ist in Ordnung, wenn Sie die Validierung TT / MM / JJJJ überprüfen möchten

function isValidDate(date) {
    var temp = date.split('/');
    var d = new Date(temp[1] + '/' + temp[0] + '/' + temp[2]);
     return (d && (d.getMonth() + 1) == temp[1] && d.getDate() == Number(temp[0]) && d.getFullYear() == Number(temp[2]));
}

alert(isValidDate('29/02/2015')); // it not exist ---> false
            

Sprosse
quelle
2

Suchen Sie im folgenden Code, mit dem die Datumsüberprüfung für eines der angegebenen Formate durchgeführt werden kann, um Start- / End- und End- / Bis-Daten zu überprüfen. Es könnte einige bessere Ansätze geben, aber ich habe mir diese ausgedacht. Beachten Sie, dass das mitgelieferte Datumsformat und die Datumszeichenfolge Hand in Hand gehen.

<script type="text/javascript">
    function validate() {

        var format = 'yyyy-MM-dd';

        if(isAfterCurrentDate(document.getElementById('start').value, format)) {
            alert('Date is after the current date.');
        } else {
            alert('Date is not after the current date.');
        }
        if(isBeforeCurrentDate(document.getElementById('start').value, format)) {
            alert('Date is before current date.');
        } else {
            alert('Date is not before current date.');
        }
        if(isCurrentDate(document.getElementById('start').value, format)) {
            alert('Date is current date.');
        } else {
            alert('Date is not a current date.');
        }
        if (isBefore(document.getElementById('start').value, document.getElementById('end').value, format)) {
            alert('Start/Effective Date cannot be greater than End/Expiration Date');
        } else {
            alert('Valid dates...');
        }
        if (isAfter(document.getElementById('start').value, document.getElementById('end').value, format)) {
            alert('End/Expiration Date cannot be less than Start/Effective Date');
        } else {
            alert('Valid dates...');
        }
        if (isEquals(document.getElementById('start').value, document.getElementById('end').value, format)) {
            alert('Dates are equals...');
        } else {
            alert('Dates are not equals...');
        }
        if (isDate(document.getElementById('start').value, format)) {
            alert('Is valid date...');
        } else {
            alert('Is invalid date...');
        }
    }

    /**
     * This method gets the year index from the supplied format
     */
    function getYearIndex(format) {

        var tokens = splitDateFormat(format);

        if (tokens[0] === 'YYYY'
                || tokens[0] === 'yyyy') {
            return 0;
        } else if (tokens[1]=== 'YYYY'
                || tokens[1] === 'yyyy') {
            return 1;
        } else if (tokens[2] === 'YYYY'
                || tokens[2] === 'yyyy') {
            return 2;
        }
        // Returning the default value as -1
        return -1;
    }

    /**
     * This method returns the year string located at the supplied index
     */
    function getYear(date, index) {

        var tokens = splitDateFormat(date);
        return tokens[index];
    }

    /**
     * This method gets the month index from the supplied format
     */
    function getMonthIndex(format) {

        var tokens = splitDateFormat(format);

        if (tokens[0] === 'MM'
                || tokens[0] === 'mm') {
            return 0;
        } else if (tokens[1] === 'MM'
                || tokens[1] === 'mm') {
            return 1;
        } else if (tokens[2] === 'MM'
                || tokens[2] === 'mm') {
            return 2;
        }
        // Returning the default value as -1
        return -1;
    }

    /**
     * This method returns the month string located at the supplied index
     */
    function getMonth(date, index) {

        var tokens = splitDateFormat(date);
        return tokens[index];
    }

    /**
     * This method gets the date index from the supplied format
     */
    function getDateIndex(format) {

        var tokens = splitDateFormat(format);

        if (tokens[0] === 'DD'
                || tokens[0] === 'dd') {
            return 0;
        } else if (tokens[1] === 'DD'
                || tokens[1] === 'dd') {
            return 1;
        } else if (tokens[2] === 'DD'
                || tokens[2] === 'dd') {
            return 2;
        }
        // Returning the default value as -1
        return -1;
    }

    /**
     * This method returns the date string located at the supplied index
     */
    function getDate(date, index) {

        var tokens = splitDateFormat(date);
        return tokens[index];
    }

    /**
     * This method returns true if date1 is before date2 else return false
     */
    function isBefore(date1, date2, format) {
        // Validating if date1 date is greater than the date2 date
        if (new Date(getYear(date1, getYearIndex(format)), 
                getMonth(date1, getMonthIndex(format)) - 1, 
                getDate(date1, getDateIndex(format))).getTime()
            > new Date(getYear(date2, getYearIndex(format)), 
                getMonth(date2, getMonthIndex(format)) - 1, 
                getDate(date2, getDateIndex(format))).getTime()) {
            return true;
        } 
        return false;                
    }

    /**
     * This method returns true if date1 is after date2 else return false
     */
    function isAfter(date1, date2, format) {
        // Validating if date2 date is less than the date1 date
        if (new Date(getYear(date2, getYearIndex(format)), 
                getMonth(date2, getMonthIndex(format)) - 1, 
                getDate(date2, getDateIndex(format))).getTime()
            < new Date(getYear(date1, getYearIndex(format)), 
                getMonth(date1, getMonthIndex(format)) - 1, 
                getDate(date1, getDateIndex(format))).getTime()
            ) {
            return true;
        } 
        return false;                
    }

    /**
     * This method returns true if date1 is equals to date2 else return false
     */
    function isEquals(date1, date2, format) {
        // Validating if date1 date is equals to the date2 date
        if (new Date(getYear(date1, getYearIndex(format)), 
                getMonth(date1, getMonthIndex(format)) - 1, 
                getDate(date1, getDateIndex(format))).getTime()
            === new Date(getYear(date2, getYearIndex(format)), 
                getMonth(date2, getMonthIndex(format)) - 1, 
                getDate(date2, getDateIndex(format))).getTime()) {
            return true;
        } 
        return false;
    }

    /**
     * This method validates and returns true if the supplied date is 
     * equals to the current date.
     */
    function isCurrentDate(date, format) {
        // Validating if the supplied date is the current date
        if (new Date(getYear(date, getYearIndex(format)), 
                getMonth(date, getMonthIndex(format)) - 1, 
                getDate(date, getDateIndex(format))).getTime()
            === new Date(new Date().getFullYear(), 
                    new Date().getMonth(), 
                    new Date().getDate()).getTime()) {
            return true;
        } 
        return false;                
    }

    /**
     * This method validates and returns true if the supplied date value 
     * is before the current date.
     */
    function isBeforeCurrentDate(date, format) {
        // Validating if the supplied date is before the current date
        if (new Date(getYear(date, getYearIndex(format)), 
                getMonth(date, getMonthIndex(format)) - 1, 
                getDate(date, getDateIndex(format))).getTime()
            < new Date(new Date().getFullYear(), 
                    new Date().getMonth(), 
                    new Date().getDate()).getTime()) {
            return true;
        } 
        return false;                
    }

    /**
     * This method validates and returns true if the supplied date value 
     * is after the current date.
     */
    function isAfterCurrentDate(date, format) {
        // Validating if the supplied date is before the current date
        if (new Date(getYear(date, getYearIndex(format)), 
                getMonth(date, getMonthIndex(format)) - 1, 
                getDate(date, getDateIndex(format))).getTime()
            > new Date(new Date().getFullYear(),
                    new Date().getMonth(), 
                    new Date().getDate()).getTime()) {
            return true;
        } 
        return false;                
    }

    /**
     * This method splits the supplied date OR format based 
     * on non alpha numeric characters in the supplied string.
     */
    function splitDateFormat(dateFormat) {
        // Spliting the supplied string based on non characters
        return dateFormat.split(/\W/);
    }

    /*
     * This method validates if the supplied value is a valid date.
     */
    function isDate(date, format) {                
        // Validating if the supplied date string is valid and not a NaN (Not a Number)
        if (!isNaN(new Date(getYear(date, getYearIndex(format)), 
                getMonth(date, getMonthIndex(format)) - 1, 
                getDate(date, getDateIndex(format))))) {                    
            return true;
        } 
        return false;                                      
    }
</script>

Unten ist das HTML-Snippet

<input type="text" name="start" id="start" size="10" value="" />
<br/>
<input type="text" name="end" id="end" size="10" value="" />
<br/>
<input type="button" value="Submit" onclick="javascript:validate();" />
Dinesh Lomte
quelle
Ausgezeichnet. Das habe ich gesucht.
Turbo
1

Ich habe den größten Teil dieses Codes aus einem anderen Beitrag gezogen, der hier gefunden wurde . Ich habe es für meine Zwecke geändert. Das funktioniert gut für das, was ich brauche. Es kann in Ihrer Situation helfen.

$(window).load(function() {
  function checkDate() {
    var dateFormat = /^(0?[1-9]|[12][0-9]|3[01])[\/\-](0?[1-9]|1[012])[\/\-]\d{4}$/;
    var valDate = $(this).val();
    if ( valDate.match( dateFormat )) {
      $(this).css("border","1px solid #cccccc","color", "#555555", "font-weight", "normal");
      var seperator1 = valDate.split('/');
      var seperator2 = valDate.split('-');

      if ( seperator1.length > 1 ) {
        var splitdate = valDate.split('/');
      } else if ( seperator2.length > 1 ) {
        var splitdate = valDate.split('-');
      }

      var dd = parseInt(splitdate[0]);
      var mm = parseInt(splitdate[1]);
      var yy = parseInt(splitdate[2]);
      var ListofDays = [31,28,31,30,31,30,31,31,30,31,30,31];

      if ( mm == 1 || mm > 2 ) {
        if ( dd > ListofDays[mm - 1] ) {
          $(this).val("");
          $(this).css("border","solid red 1px","color", "red", "font-weight", "bold");
          alert('Invalid Date! You used a date which does not exist in the known calender.');
          return false;
        }
      }

      if ( mm == 2 ) {
       var lyear = false;
        if ( (!(yy % 4) && yy % 100) || !(yy % 400) ){
          lyear = true;
        }

        if ( (lyear==false) && (dd>=29) ) {
          $(this).val("");
          $(this).css("border","solid red 1px","color", "red", "font-weight", "bold");
          alert('Invalid Date! You used Feb 29th for an invalid leap year');
          return false;
        }

        if ( (lyear==true) && (dd>29) ) {
          $(this).val("");
          $(this).css("border","solid red 1px","color", "red", "font-weight", "bold");
          alert('Invalid Date! You used a date greater than Feb 29th in a valid leap year');
          return false;
        }
     }
    } else {
      $(this).val("");
      $(this).css("border","solid red 1px","color", "red", "font-weight", "bold");
      alert('Date format was invalid! Please use format mm/dd/yyyy');
      return false;
    }
  };

  $('#from_date').change( checkDate );
  $('#to_date').change( checkDate );
});
Sknight
quelle
1

Ähnlich wie Elian Ebbing Antwort, aber unterstützen "\", "/", ".", "-", "" Trennzeichen

function js_validate_date_dmyyyy(js_datestr)
{
    var js_days_in_year = [ 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ];
    var js_datepattern = /^(\d{1,2})([\.\-\/\\ ])(\d{1,2})([\.\-\/\\ ])(\d{4})$/;

    if (! js_datepattern.test(js_datestr)) { return false; }

    var js_match = js_datestr.match(js_datepattern);
    var js_day = parseInt(js_match[1]);
    var js_delimiter1 = js_match[2];
    var js_month = parseInt(js_match[3]);
    var js_delimiter2 = js_match[4];
    var js_year = parseInt(js_match[5]);                            

    if (js_is_leap_year(js_year)) { js_days_in_year[2] = 29; }

    if (js_delimiter1 !== js_delimiter2) { return false; } 
    if (js_month === 0  ||  js_month > 12)  { return false; } 
    if (js_day === 0  ||  js_day > js_days_in_year[js_month])   { return false; } 

    return true;
}

function js_is_leap_year(js_year)
{ 
    if(js_year % 4 === 0)
    { 
        if(js_year % 100 === 0)
        { 
            if(js_year % 400 === 0)
            { 
                return true; 
            } 
            else return false; 
        } 
        else return true; 
    } 
    return false; 
}
ihorsl
quelle
Ihre Tage und Monate sind rückwärts.
BoundForGlory
1
function fdate_validate(vi)
{
  var parts =vi.split('/');
  var result;
  var mydate = new Date(parts[2],parts[1]-1,parts[0]);
  if (parts[2] == mydate.getYear() && parts[1]-1 == mydate.getMonth() && parts[0] == mydate.getDate() )
  {result=0;}
  else
  {result=1;}
  return(result);
}
Sai Sreenivas
quelle
3
Während dieser Code die Frage möglicherweise beantwortet, würde die Bereitstellung eines zusätzlichen Kontexts darüber, wie und / oder warum das Problem gelöst wird, den langfristigen Wert der Antwort verbessern.
thewaywewere
1

Moment ist wirklich ein guter Moment, um es zu lösen. Ich sehe keinen Grund, Komplexität hinzuzufügen, nur um das Datum zu überprüfen ... werfen Sie einen Blick auf den Moment: http://momentjs.com/

HTML:

<input class="form-control" id="date" name="date" onchange="isValidDate(this);" placeholder="DD/MM/YYYY" type="text" value="">

Skript :

 function isValidDate(dateString)  {
    var dateToValidate = dateString.value
    var isValid = moment(dateToValidate, 'MM/DD/YYYY',true).isValid()
    if (isValid) {
        dateString.style.backgroundColor = '#FFFFFF';
    } else {
        dateString.style.backgroundColor = '#fba';
    }   
};
Doug Mugnos
quelle
0

Das erste Zeichenfolgendatum wird in das js-Datumsformat konvertiert und erneut in das Zeichenfolgenformat konvertiert. Anschließend wird es mit der ursprünglichen Zeichenfolge verglichen.

function dateValidation(){
    var dateString = "34/05/2019"
    var dateParts = dateString.split("/");
    var date= new Date(+dateParts[2], dateParts[1] - 1, +dateParts[0]);

    var isValid = isValid( dateString, date );
    console.log("Is valid date: " + isValid);
}

function isValidDate(dateString, date) {
    var newDateString = ( date.getDate()<10 ? ('0'+date.getDate()) : date.getDate() )+ '/'+ ((date.getMonth() + 1)<10? ('0'+(date.getMonth() + 1)) : (date.getMonth() + 1) )  + '/' +  date.getFullYear();
    return ( dateString == newDateString);
}
ctw_87
quelle
0

Wir können benutzerdefinierte Funktionen oder Datumsmuster verwenden. Der folgende Code ist eine benutzerdefinierte Funktion, die Ihren Anforderungen entspricht. Bitte ändern Sie sie.

 function isValidDate(str) {
        var getvalue = str.split('-');
        var day = getvalue[2];
        var month = getvalue[1];
        var year = getvalue[0];
        if(year < 1901 && year > 2100){
        return false;
        }
        if (month < 1 && month > 12) { 
          return false;
         }
         if (day < 1 && day > 31) {
          return false;
         }
         if ((month==4 && month==6 && month==9 && month==11) && day==31) {
          return false;
         }
         if (month == 2) { // check for february 29th
          var isleap = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));
          if (day>29 || (day==29 && !isleap)) {
           return false;
         }
         }
         else{
         return true;

         }
        }
VIKRAM
quelle
0

Es ist ungewöhnlich, einen so alten Beitrag zu einem so grundlegenden Thema zu sehen, mit so vielen Antworten, von denen keine richtig ist. (Ich sage nicht, dass keiner von ihnen funktioniert.)

  • Eine Schaltjahr-Bestimmungsroutine ist hierfür nicht erforderlich. Die Sprache kann das für uns tun.
  • Moment wird dafür nicht benötigt.
  • Date.parse()sollte nicht für lokale Datumszeichenfolgen verwendet werden. MDN sagt: "Es wird nicht empfohlen, Date.parse zu verwenden, da das Parsen von Zeichenfolgen bis ES5 vollständig implementierungsabhängig war." Die Norm erfordert eine (möglicherweise vereinfachte) ISO 8601-Zeichenfolge. Die Unterstützung für jedes andere Format ist implementierungsabhängig.
  • Auch sollte new Date(string)verwendet werden, weil das Date.parse verwendet ().
  • IMO sollte der Schalttag validiert werden.
  • Die Validierungsfunktion muss die Möglichkeit berücksichtigen, dass die Eingabezeichenfolge nicht mit dem erwarteten Format übereinstimmt. Zum Beispiel '1a / 2a / 3aaa', '1234567890' oder 'ab / cd / efgh'.

Hier ist eine effiziente, präzise Lösung ohne implizite Konvertierungen. Es nutzt die Bereitschaft des Date-Konstruktors, 2018-14-29 als 2019-03-01 zu interpretieren. Es werden einige moderne Sprachfunktionen verwendet, die jedoch bei Bedarf leicht entfernt werden können. Ich habe auch einige Tests aufgenommen.

function isValidDate(s) {
    // Assumes s is "mm/dd/yyyy"
    if ( ! /^\d\d\/\d\d\/\d\d\d\d$/.test(s) ) {
        return false;
    }
    const parts = s.split('/').map((p) => parseInt(p, 10));
    parts[0] -= 1;
    const d = new Date(parts[2], parts[0], parts[1]);
    return d.getMonth() === parts[0] && d.getDate() === parts[1] && d.getFullYear() === parts[2];
}

function testValidDate(s) {
    console.log(s, isValidDate(s));
}
testValidDate('01/01/2020'); // true
testValidDate('02/29/2020'); // true
testValidDate('02/29/2000'); // true
testValidDate('02/29/1900'); // false
testValidDate('02/29/2019'); // false
testValidDate('01/32/1970'); // false
testValidDate('13/01/1970'); // false
testValidDate('14/29/2018'); // false
testValidDate('1a/2b/3ccc'); // false
testValidDate('1234567890'); // false
testValidDate('aa/bb/cccc'); // false
testValidDate(null);         // false
testValidDate('');           // false
Jay Dunning
quelle
-1
  1. Javascript

    function validateDate(date) {
        try {
            new Date(date).toISOString();
            return true;
        } catch (e) { 
            return false; 
        }
    }
  2. JQuery

    $.fn.validateDate = function() {
        try {
            new Date($(this[0]).val()).toISOString();
            return true;
        } catch (e) { 
            return false; 
        }
    }

Gibt true für eine gültige Datumszeichenfolge zurück.

Femi Rufus
quelle
-3
var date = new Date(date_string)

'Invalid Date'Gibt das Literal für eine ungültige Datumszeichenfolge zurück.

Hinweis: Bitte beachten Sie die Kommentare unten.

Sam ist
quelle
Falsch: new Date("02-31-2000")gibt Thu Mar 02 2000 00:00:00 GMT-0300 (BRT).
Falsarella
Um den Anwendungsfall, in dem er nicht funktioniert, näher zu erläutern, lesen Sie bitte den ersten Hinweis in der Dokumentation zu den Datumsparametern von Mozilla .
Falsarella
1
Ja, ich lasse dies in erster Linie offen, um zu zeigen, dass sie Alternativen zum Schreiben von Ad-hoc-Parses sind. Der obige Link ist maßgebend. Netter Doc!
Samis