Dans le cas de la mise à jour de la FAQ, je viens de voir que :

http://javascript.developpez.com/faq...erifFormatDate

Le code n'est pas du tout joli et mérite un petit coup de jeune.

Maintenant il reste à rendre mon code un peu plus humainement lisible.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
 
/**
  Cette fonction valide une date à partir des valeurs d'une date : 
dateValidate(2012, 2, 30) => false;
dateValidate(2011, 11, 24) => true;
 
*/
function dateValidate(y, m, d) {
    d=new Date(y, m-1, d);
    return d.getMonth() == m-1 && d.getFullYear()==y;
};
 
 
/**
   Cette fonction valide une chaine de caractère
   et dit si c'est une date valide ou non,
   on part du principe que la date est au
    format YYYY/MM/DD (le caractère de séparation des chiffres étant optionnel.
   dateValidateStr("2012/12/25");  => true;
   dateValidateStr("2012/2/31");  => false;
 
Fonction peut vraiment utile. on peut la jeter au profit de la suivante
*/
function dateValidateStr(str) {
  var v = str.split(/\D+/);
  return dateValidate.apply(this,v);
}
 
/**
   Cette fonction valide une date en fonction du mask
   Elle reutilise la fonction dateValidate.
 
dateValidateFromMask("2012/31/12","YYYY/DD/MM"); => true;
dateValidateFromMask("2012/31/12","YYYY/MM/DD"); => false;
dateValidateFromMask("03/25/1998","MM/DD/YYYY"); => true;
dateValidateFromMask("03/25/1998","mm/dd/yyyy"); => true;
 
 
*/
 
function dateValidateFromMask(str, mask) {
    //Valide la date pour savoir si elle respecte le mask
    if(!new RegExp(mask.replace(/[ymd]/gi,'\\d').replace(/\//g,'\\/')).test(str)) return false;
 
    // valide la date au niveau des valeurs y/m/d
    var dateArr = str.split(/\D+/),
        values = {};
 
    // créé un objet qui associera les y/m/d du mask avec la date pour ensuite les reutiliser la fonction dateValidate.
    // si str = "2012/23/05" et mask = "YYYY/DD/MM";
    // values = {y:"2012", m:"05", d:"23"};
    mask.match(/([ymd]+)/gi).forEach(function(str,i) {
      values[str.charAt(0).toLowerCase()] = dateArr[i];
    });
    return dateValidate(values.y, values.m, values.d);
}