web-dev-qa-db-fra.com

comment analyser une chaîne de date formatée "jj / mm / aaaa" ou "jj-mm-aaaa" ou "jj-mmm-aaaa" à l'aide de JavaScript ou jQuery

Duplicate possible:
Extension du fichier Date.parse de JavaScript pour permettre le format JJ/MM/AAAA (dates non formatées aux États-Unis)?
Convertir une chaîne jj-mm-aaaa en date

Entrez une date dans la zone de texte, par exemple: 05/09/1985, et je voulais la convertir en 05-Sep-1985 (jj-MMM- yyyy) format. Comment pourrais-je y parvenir? Notez que le format source peut être dd-mm-yyyy ou dd/mm/yyyy ou dd-mmm-yyyy _ format.

Extrait de code:

 function GetDateFormat(controlName) {
        if ($('#' + controlName).val() != "") {      
            var d1 = Date.parse($('#' + controlName).val());
            if (d1 == null) {
                alert('Date Invalid.');
                $('#' + controlName).val("");
            }
                var array = d1.toString('dd-MMM-yyyy');
                $('#' + controlName).val(array);
        }
    }

Ce code retourne 09-mai-1985 mais je veux 05-Sep-1985. Merci.

41

Vous voudrez peut-être utiliser une bibliothèque auxiliaire comme http://momentjs.com/ qui enveloppe l'objet de date javascript natif pour faciliter les manipulations.

Ensuite, vous pouvez faire des choses comme:

var day = moment("12-25-1995", "MM-DD-YYYY");

ou

var day = moment("25/12/1995", "DD/MM/YYYY");

puis opérer à la date

day.add('days', 7)

et pour obtenir la date javascript native

day.toDate();
58
user1372449

Mettre à jour

Ci-dessous vous avez dit:

Désolé, je ne peux pas prédire le format de la date auparavant, cela devrait être comme le format jj-mm-aaaa ou jj/mm/aaaa ou jj-mmm-aaaa. Enfin, je voulais convertir tout ce format au format jj-MMM-aaaa.

Cela complètement modifie la question. Ce sera beaucoup plus complexe si vous ne pouvez pas contrôler le format. Il n'y a rien dans JavaScript qui vous permette de spécifier un format de date. Officiellement, le seul format de date pris en charge par JavaScript est un version simplifiée d’ISO-8601 : yyyy-mm-dd, bien que pratiquement tous les navigateurs prennent également en charge yyyy/mm/dd ainsi que. Mais à part cela, vous devez écrire le code vous-même ou (et cela a beaucoup plus de sens) utiliser une bonne bibliothèque. J'utiliserais probablement une bibliothèque comme moment.js ou DateJS (bien que DateJS n'ait pas été maintenu depuis des années).


Réponse originale :

Si le format est toujoursdd/mm/yyyy, alors c'est trivial:

var parts = str.split("/");
var dt = new Date(parseInt(parts[2], 10),
                  parseInt(parts[1], 10) - 1,
                  parseInt(parts[0], 10));

split divise une chaîne sur le délimiteur donné. Ensuite, nous utilisons parseInt pour convertir les chaînes en nombres, et nous utilisons le new Date constructeur pour construire un Date à partir de ces parties: la troisième partie sera l’année, la deuxième partie le mois et la première partie le jour. Date utilise des nombres de mois basés sur zéro, nous devons donc soustraire un du nombre de mois.

41
T.J. Crowder

Date.parse ne reconnaît que des formats spécifiques et vous n'avez pas la possibilité de lui indiquer le format de votre entrée. Dans ce cas, il pense que l'entrée est au format mm/dd/yyyy, le résultat est donc faux.

Pour résoudre ce problème, vous devez soit analyser l’entrée vous-même (par exemple avec String.split ) et ensuite construction manuelle un objet Date ou utilisez une bibliothèque plus complète, telle que datejs .

Exemple pour l'analyse manuelle:

var input = $('#' + controlName).val();
var parts = str.split("/");
var d1 = new Date(Number(parts[2]), Number(parts[1]) - 1, Number(parts[0]));

Exemple avec date.js:

var input = $('#' + controlName).val();
var d1 = Date.parseExact(input, "d/M/yyyy");
9
Jon

Essaye ça:

 function GetDateFormat(controlName) {
        if ($('#' + controlName).val() != "") {      
            var d1 = Date.parse($('#' + controlName).val().toString().replace(/([0-9]+)\/([0-9]+)/,'$2/$1'));
            if (d1 == null) {
                alert('Date Invalid.');
                $('#' + controlName).val("");
            }
                var array = d1.toString('dd-MMM-yyyy');
                $('#' + controlName).val(array);
        }
    }

La RegExp remplace .replace(/([0-9]+)\/([0-9]+)/,'$2/$1') change la position du jour/mois.

3
Paulo H.