web-dev-qa-db-fra.com

Comment puis-je déterminer si une chaîne donnée représente une date?

Existe-t-il une fonction isDate dans jQuery?

Il devrait retourner true si l'entrée est une date et false sinon.

18
Kuttan Sujith

En fonction de la manière dont vous essayez d'implémenter cela, vous pourrez peut-être utiliser le plugin jQuery "validate" avec l'option date set.

5
irishbuzz

Si vous ne souhaitez pas utiliser de bibliothèques externes, voici une solution simple utilisant uniquement du javascript:

function isDate(val) {
    var d = new Date(val);
    return !isNaN(d.valueOf());
}

MISE À JOUR: !! Avertissement majeur !!
@BarryPicker soulève un bon point dans les commentaires. JavaScript convertit silencieusement le 29 février au 1er mars pour toutes les années non bissextiles. Ce comportement semble être strictement limité aux jours jusqu'à 31 (par exemple, le 32 mars n'est pas converti au 1er avril, mais le 31 juin est converti au 1er juillet). Selon votre situation, cela peut être une limite que vous pouvez accepter, mais vous devez en être conscient:

>>> new Date('2/29/2014')
Sat Mar 01 2014 00:00:00 GMT-0500 (Eastern Standard Time)
>>> new Date('3/32/2014')
Invalid Date
>>> new Date('2/29/2015')
Sun Mar 01 2015 00:00:00 GMT-0500 (Eastern Standard Time)
>>> isDate('2/29/2014')
true  // <-- no it's not true! 2/29/2014 is not a valid date!
>>> isDate('6/31/2015')
true  // <-- not true again! Apparently, the crux of the problem is that it
      //     allows the day count to reach "31" regardless of the month..
34
mwolfe02

Il n'y a pas de fonctionnalité de date intégrée dans jQuery Core ... et cela ne fait pas vraiment quelque chose qui aide directement avec les dates, donc il n'y a pas beaucoup de bibliothèques en plus (à moins qu'il s'agisse de sélecteurs de date, etc.). Il existe plusieurs bibliothèques de date JavaScript disponibles , pour faciliter leur travail.

Je ne peux pas vous dire avec certitude quel est le meilleur ... cela dépend de la façon dont ils y entrent et de la culture à laquelle vous êtes confronté. N'oubliez pas que différentes cultures ont l'habitude de voir leurs dates sous un format différent, par exemple, MM/DD/YYYY vs YYYY/MM/DD (ou des dizaines d'autres).

4
Nick Craver

la manière la plus simple en javascript est:

function isDate(dateVal) {
  var d = new Date(dateVal);
  return d.toString() === 'Invalid Date'? false: true;
}
3
SambitD

Le meilleur moyen de saisir la date de l'utilisateur est un sélecteur de date qui fournit uniquement des dates valides . Cela peut être fait avec une chaîne, mais vous êtes susceptible d'irriter vos utilisateurs en exigeant qu'ils utilisent le format choisi.

Vous devez spécifier dans votre validateur si les dates précèdent les mois.

Ceci utilise un deuxième argument pour appliquer la commande . Sans deuxième argument, il utilise la commande par défaut de l'ordinateur.

// computer default date format order:
Date.ddmm= (function(){
    return Date.parse('2/6/2009')> Date.parse('6/2/2009');
})()

autorise les noms de mois ainsi que les chiffres: "21 janvier 2000" ou "21 octobre 1975"

function validay(str, order){
    if(order== undefined) order= Date.ddmm? 0: 1;
    var day, month, D= Date.parse(str);
    if(D){
        str= str.split(/\W+/);

        // check for a month name first:
        if(/\D/.test(str[0])) day= str[1];
        else if (/\D/.test(str[1])) day= str[0];
        else{
            day= str[order];
            month= order? 0: 1;
            month= parseInt(str[month], 10) || 13;
        }
        try{
            D= new Date(D);
            if(D.getDate()== parseInt(day, 10)){
                if(!month || D.getMonth()== month-1) return D;
            }
        }
        catch(er){}
    }
    return false;
}
2
kennebec

Le problème est que la saisie du 31 février renverra une date valide en JavaScript. Entrez l'année, le mois et le jour, transformez-le en date et voyez si cette date correspond à celle que vous avez entrée au lieu d'un jour de mars.

function isDate(y, m, d) {
    var a = new Date(y, m-1, d); 
    // subtract 1 from the month since .getMonth() is zero-indexed.
    if (a.getFullYear() == y && a.getMonth() == m-1 && a.getDate() == d) { 
        return true; 
    } else {
        return false;
    } 
}

Techniquement, il s'agit de JavaScript vanille, car jQuery ne développe pas vraiment l'objet Date natif. 

1
invot

Je suppose que vous voulez quelque chose comme ça. +1 si cela fonctionne pour vous.

HTML

 Date : <input type="text" id="txtDate" /> (mm/dd/yyyy)
 <br/><br/><br/>
<input type="button" value="ValidateDate" id="btnSubmit"/>

jQuery

$(function() {
$('#btnSubmit').bind('click', function(){
    var txtVal =  $('#txtDate').val();
    if(isDate(txtVal))
        alert('Valid Date');
    else
        alert('Invalid Date');
});

function isDate(txtDate)
{
var currVal = txtDate;
if(currVal == '')
    return false;

var rxDatePattern = /^(\d{1,2})(\/|-)(\d{1,2})(\/|-)(\d{4})$/; //Declare Regex
var dtArray = currVal.match(rxDatePattern); // is format OK?

if (dtArray == null) 
    return false;

//Checks for mm/dd/yyyy format.
dtMonth = dtArray[1];
dtDay= dtArray[3];
dtYear = dtArray[5];        

if (dtMonth < 1 || dtMonth > 12) 
    return false;
else if (dtDay < 1 || dtDay> 31) 
    return false;
else if ((dtMonth==4 || dtMonth==6 || dtMonth==9 || dtMonth==11) && dtDay ==31) 
    return false;
else if (dtMonth == 2) 
{
    var isleap = (dtYear % 4 == 0 && (dtYear % 100 != 0 || dtYear % 400 == 0));
    if (dtDay> 29 || (dtDay ==29 && !isleap)) 
            return false;
}
return true;
}

});

CSS

body{
font-family:Tahoma;
font-size : 8pt;
padding-left:10px;
}
input[type="text"]
{
font-family:Tahoma;
font-size : 8pt;
width:150px;
}

DEMO

0
Vikash Mishra

Si vous ne voulez pas utiliser le plugin jquery, j'ai trouvé la fonction sur: 

http://www.codetoad.com/forum/17_10053.asp

Travaille pour moi. Les autres que j'ai trouvés ne fonctionnent pas très bien.

MIS À JOUR:

Depuis la version en cache de la page à l'adresse: http://web.archive.org/web/20120228171226/http://www.codetoad.com/forum/17_10053.asp

// ******************************************************************
// This function accepts a string variable and verifies if it is a
// proper date or not. It validates format matching either
// mm-dd-yyyy or mm/dd/yyyy. Then it checks to make sure the month
// has the proper number of days, based on which month it is.

// The function returns true if a valid date, false if not.
// ******************************************************************

function isDate(dateStr) {

    var datePat = /^(\d{1,2})(\/|-)(\d{1,2})(\/|-)(\d{4})$/;
    var matchArray = dateStr.match(datePat); // is the format ok?

    if (matchArray == null) {
        alert("Please enter date as either mm/dd/yyyy or mm-dd-yyyy.");
        return false;
    }

    month = matchArray[1]; // p@rse date into variables
    day = matchArray[3];
    year = matchArray[5];

    if (month < 1 || month > 12) { // check month range
        alert("Month must be between 1 and 12.");
        return false;
    }

    if (day < 1 || day > 31) {
        alert("Day must be between 1 and 31.");
        return false;
    }

    if ((month == 4 || month == 6 || month == 9 || month == 11) && day == 31) {
        alert("Month " + month + " doesn`t have 31 days!")
        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)) {
            alert("February " + year + " doesn`t have " + day + " days!");
            return false;
        }
    }
    return true; // date is valid
}

0
Mike Cheel

Date.parse sera prb pour vous trier, sans avoir besoin de jquery:

http://www.w3schools.com/jsref/jsref_parse.asp </ strike>

Ci-dessus, supprimé après qu'une sorte d'âme ait souligné à quel point l'analyse de DateDate est fondamentale.

Il existe également une méthode "parseDate" dans le plugin JQuery UI Datepicker:

http://docs.jquery.com/UI/Datepicker/parseDate

0
Matt Roberts

Je suis arrivé à cette solution, rendue plus compliquée car j'utilise le format européen et que javascript est clairement américain!

function CheckDate()
{
    var D = document.getElementById('FlightDate').value;
    var values = D.split("-")
    var newD = values [1] + "/" + values [0] + "/" + values[2]
    var d = new Date(newD);
    if(d == 'Invalid Date')document.getElementById('FlightDate').value = "";
}

Malpropre, mais fait le boulot ... Si vos utilisateurs sont américains et mettent la journée au milieu (que je ne comprendrai jamais!), Vous pouvez laisser de côté la scission et la création du newD.

Il est probable que je puisse outrepasser l'américanisme par défaut dans le JS en définissant une culture ou une autre, mais mon public cible est exclusivement européen, il était donc plus facile de le tracer de cette façon ... t testé sur autre chose.)

0
user2981217

Vous devriez utiliser moment.js c'est la meilleure librairie pour gérer toutes sortes de dates . Solution à votre problème:

var inputVal = '2012-05-25';
moment(inputVal , 'YYYY-MM-DD', true).isValid();
0
alecellis1985