web-dev-qa-db-fra.com

JavaScript getDate renvoie une date erronée

Le script suivant renvoie 20 au lieu de 21!

var d = new Date("2010/03/21");
document.write(d.getDate());

Qu'est-ce que je fais mal? Est-ce un bug JavaScript?

42
VahidN

La méthode Date.parse dépend de la mise en œuvre (new Date(string) est équivalent à Date.parse(string) ).

Bien que ce format soit disponible sur les navigateurs modernes, vous ne pouvez pas être sûr à 100% que le navigateur interprétera exactement le format souhaité.

Je vous recommanderais de manipuler votre chaîne et d'utiliser le constructeur Date avec les arguments année, mois et jour:

// parse a date in yyyy-mm-dd format
function parseDate(input) {
  var parts = input.match(/(\d+)/g);
  // new Date(year, month [, date [, hours[, minutes[, seconds[, ms]]]]])
  return new Date(parts[0], parts[1]-1, parts[2]); // months are 0-based
}
52
CMS

Il s'agit d'un problème d'heure d'été, car Date () utilise l'heure locale.

J'habite au Brésil et le 21 octobre 2012 marque le début de l'heure d'été dans la plupart des régions de mon pays. Les dates locales au 21 octobre 2012, entre 0: 0 et 1: 0, n'existent pas au Brésil!

Certaines personnes commentent ici que cela fonctionne. Cela se produit parce que le retour à l'heure correct ou non dépend du pays de l'utilisateur local.

Voir: http://www.timeanddate.com/news/time/brazil-dst-2012.html

Au Brésil, en 2012, Java pense que l'heure d'été commence le 14 octobre (en fait, il commence à 1 semaine plus tard)

var dt = new Date(2012,9,14); 
alert(dt.getHours());

produit 1 et

Voir: http://www.timeanddate.com/time/dst/2013.html

La solution consiste à utiliser l’heure UTC (temps universel coordonné), car il n’ya pas de modification de l’heure avancée et vous utilisez une sorte d’heure abstraite. Dans la plupart des applications pratiques, il n'y a pas de problème.

var dt = new Date( Date.UTC(2012, 9, 21, 8, 5, 12));
alert( (dt.getUTCMonth()+1) + '/' + dt.getUTCDate() + '/' + 
        dt.getUTCFullYear() + " " + dt.getUTCHours()+ ':' + 
        dt.getUTCMinutes() + ':' + dt.getUTCSeconds() );

c'est plus facile si quelqu'un n'utilise pas les heures, les minutes et les secondes, il suffit de placer une valeur de l'heure factice supérieure ou égale à 1, comme je l'ai montré ci-dessus.

29
Paulo Buchsbaum

Est-il possible que l'argument de chaîne soit traité comme UTC et l'objet Date résultant comme heure locale ou vice versa? Cela pourrait le jeter. Comparez d.getDate() à d.getUTCDate().

15
eyelidlessness

Je reçois également un écart d'un jour à travers getDate(), mais je remarque que getUTCDate() renvoie la valeur attendue. Le problème a été constaté dans la version 3.6.12 de FF, mais le même code fonctionnant sous Chrome fonctionnait correctement.

Mon code de débogage:

var date="2010-11-04";
alert(date);
var d = new Date(date)
alert(d.toDateString()+": "+ d.getDate()+" UTC "+d.getUTCDate());

Cela a donné une sortie (FireFox): 

Mer. 03 nov. 2010: 3 UTC 4

Chrome est bien. Donc quelque chose ne va pas quelque part - peut-être un bogue, mais plutôt un problème de paramètre fuseau horaire/UTC. Cela me rappelle où PHP date() retournera 23 heures dans une journée si le fuseau horaire a changé ce jour-là, etc.

4
Chris

J'ai écrit le code suivant dans la barre d'adresse de mon navigateur et le résultat était 21

javascript:alert(new Date("2010/03/21").getDate())

Il n’existe pas de bogue Javascript, car il existe de nombreuses implémentations Javascript. Vous devrez donc vous référer à une implémentation spécifique.

L'implémentation que j'ai testée était Chrome 4.1.249. Quel est ton?

2
Jader Dias

J'ai testé ce code dans Firefox 3.6 et IE 8:

<script type="text/javascript">

var d = new Date("2010/03/21");
document.write(d.getDate());

</script> 

Ça montre la bonne date: 21

Pour plus d'informations, consultez: JavaScript Date Object

Vous pouvez également lire/ Considérations sur la compatibilité JavaScript sur Wikipedia.

1
Leniel Maccaferri

C'est le fuseau horaire qui joue un rôle majeur ici. La fonction Date() ajoutera votre fuseau horaire à la date que vous donnez comme entrée. Par exemple: j'ai donné l'entrée comme ceci:

alert(new Date("2018-09-15"));

Le résultat pour moi est: sam 15 sept. 2018 05:30:00 GMT + 0530 (heure normale de l'Inde) 

Le fuseau horaire +05:30 est ajouté à l'heure de mon entrée (vous pouvez voir dans le résultat ci-dessus..05: 30: 00 est ajouté à la date. Maintenant, ce que je dis, c'est si vous êtes dans le fuseau horaire inférieur à 0 [pays comme le Brésil, le Mexique, le Chili, etc ... ayant un fuseau horaire inférieur à 0], cela s'ajoutera à votre saisie de la date (par exemple: le fuseau horaire correspond à UTC-05: 00. Il soustraira -5: 00 de la date indiquée.

VahidN , vous obtenez le résultat 20 car vous vous trouvez dans le fuseau horaire inférieur à 0 (-1è :00`, etc ...)

La solution est réinitialisez votre fuseau horaire à 0. Comme ça:
Date ("2010-03-21T00: 00: 00").

1
Steven Bala

Je reçois la même date (21) dans firfox, safari, chrome, opera et IE, Que j'utilise la chaîne "2010/03/21" ou les arguments de date entier (2010,2,21).

J'utilise une machine Windows et de nouvelles versions des navigateurs.

vous pouvez tester pour voir si votre client analyse une date différente de la chaîne, qui est le seul endroit où je vois un problème.

if(new Date("2010/03/21")- new Date(2010,2,21)){
alert(new Date("2010/03/21"));
} 
0
kennebec

Assurez-vous que le nombre mois que vous utilisez est -1. Si vous regardez Juin, vous devez faire (6-1) pour le mois, lors de la création 

   var date_obj = new Date(y,(m-1),d);
0
CG_DEV

http://jsbin.com/aqoki3/edit - ici avec le code que vous avez posté, je reçois 21. Donc, ce n'est pas un bug JS. Peut-être que son bug dans la mise en œuvre de votre navigateur (de JS).
Pour initier correctement votre date var, utilisez new Date(year, month, date [, hour, minute, second, millisecond ]) ( https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Date ) . Ainsi, vous serez sûr que ce jour-là est 21 parce que vous le mettez implicitement à 21.

0
NilColor