Vyhledávání na webu

validace - Jak ověřit datum ve formátu "mm/dd/yyyy" v JavaScriptu?


Chci ověřit formát data na vstupu pomocí formátu mm/dd/yyyy.

Našel jsem níže uvedené kódy na jedné stránce a pak je použil, ale nefungují:

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!'); 
    } 
}

Máte nějaký nápad, co by mohlo být špatně?

Odpověď č. 1

Myslím, že Niklas má správnou odpověď na váš problém. Kromě toho si myslím, že následující funkce pro ověřování dat je trochu snazší číst:

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

Odpověď č. 2

Použil bych Moment.js pro ověřování dat.

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

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

Hodnota true je pro přísné parsování, díky @Andrey Prokhorov, což znamená

můžete pro poslední argument zadat boolean, aby Moment používal přísné parsování. Přísné parsování vyžaduje, aby se formát a vstup přesně shodovaly, včetně oddělovačů.

Odpověď č. 3

Použijte následující regulární výraz k ověření:

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

To pro mě funguje pro MM/dd/yyyy.

Odpověď č. 4

Veškeré zásluhy patří elian-ebbingovi

Pro ty líné zde také přidávám upravenou verzi funkce pro formát yyyy-mm-dd.

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

Odpověď č. 5

Je neobvyklé vidět tak starý příspěvek na tak základní téma, s tolika odpověďmi, z nichž žádná není správná. (Neříkám, že žádná z nich nefunguje.)

  • Pro toto není potřeba rutina pro určení přestupného roku. Jazyk to může za nás udělat.
  • K tomu moment není potřeba.
  • Date.parse() by neměl být používán pro místní datové řetězce. MDN uvádí: „Nedoporučuje se používat Date.parse, protože až do ES5 bylo parsování řetězců zcela závislé na implementaci.“ Standard vyžaduje (potenciálně zjednodušený) ISO 8601 řetězec; podpora jakéhokoli jiného formátu závisí na implementaci.
  • Ani by nemělo být použito new Date(string), protože to používá Date.parse().
  • Podle mě by měl být přestupný den ověřen.
  • Funkce ověřování musí brát v úvahu možnost, že vstupní řetězec neodpovídá očekávanému formátu. Například '1a/2a/3aaa', '1234567890' nebo 'ab/cd/efgh'.

Zde je efektivní, stručné řešení bez implicitních konverzí. Využívá ochotu konstruktoru Date interpretovat 2018-14-29 jako 2019-03-01. Používá sice několik moderních jazykových prvků, ale ty lze snadno odstranit, pokud je to potřeba. Přidal jsem také několik testů.

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

Odpověď č. 6

Můžete použít Date.parse()

Můžete si přečíst v dokumentaci MDN

Metoda Date.parse() analyzuje řetězcovou reprezentaci data a vrací počet milisekund od 1. ledna 1970, 00:00:00 UTC, nebo NaN, pokud je řetězec nerozpoznán nebo v některých případech obsahuje neplatné hodnoty data (např. 2015-02-31).

A zkontrolujte, zda výsledek Date.parse není NaN

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

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

  return false;
}

// when is valid date logic

Podívejte se, kdy je doporučeno používat Date.parse na MDN

Odpověď č. 7

Zdá se, že to funguje dobře pro formáty mm/dd/yyyy, například:

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

Jediný problém, který jsem měl s vaším kódem, byl ten, že:

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

Měl mezeru uvnitř závorek, před ID prvku. Změnil jsem to na:

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

Bez jakýchkoli dalších podrobností ohledně typu dat, která nefungují, není moc co dále komentovat.

Odpověď č. 8

Funkce vrátí true, pokud je zadaný řetězec ve správném formátu ('MM/DD/YYYY'), jinak vrátí false. (Tento kód jsem našel online a trochu upravil)

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

Související články