2010-03-21 3 views
39

Le script suivant renvoie 20 au lieu de 21!getDate de JavaScript renvoie une date erronée

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

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

+0

juste pour être sûr que je l'ai testé ici à la volée http://www.tlarson.com/script et dire 21 !!! –

+0

est-ce le seul code javascript sur la page? vous pourriez être exécuté un autre morceau de code. Très étrange en effet. – SoftwareGeek

+0

Quelle est la langue/le pays de votre système d'exploitation? –

Répondre

51

La méthode Date.parse dépend de l'implémentation (new Date(string) est équivalent à Date.parse(string)).

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

Je vous recommande de manipuler votre chaîne, et utilisez le constructeur de date avec l'année, le mois et les arguments 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 
} 
+2

J'ai trouvé que l'utilisation de la nouvelle date ("2010-03-21T00: 00: 00") renvoie la bonne date. Notez le T00: 00: 00 pour ajouter l'horodatage. – ferr

+1

@ ferr-ie8 (et peut-être d'autres) ne reconnaissent pas les formats ISO 8601 et retourneront une date invalide. – RobG

+0

Un peu en retard, mais pourquoi vous rétractez-vous un mois de la propriété du mois?C'est nécessaire pour une date de travail, sinon c'est un mois trop tôt, mais pourquoi? – Arendax

1

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> 

Il est montrant la bonne date: 21

Pour plus d'informations, consultez: JavaScript Date Object

Vous pouvez également lire JavaScript Compatibility considerations sur Wikipedia.

+0

c'est correct pour 2010/03/22 et 2010/03/20 mais pas pour 2010/03/21. regardez ici: http://www.kimag.es/share/84788221.png – VahidN

+1

@Anubis: Je ne peux pas voir l'image que vous avez liée. –

2

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'y a pas une telle chose comme un bug Javascript, car il y a de nombreuses implémentations Javascript, vous aurez envie de consulter à une implémentation spécifique.

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

+3

désolé! c'est 20 ici! http://www.kimag.es/share/84788221.png – VahidN

+0

J'ai aussi testé sur jsbin et ça marche bien! il revient 21! ;-) –

+0

Je ne suis pas d'accord avec la déclaration * 'Il n'y a pas de bug JavaScript' * https://bugzilla.mozilla.org/buglist.cgi?quicksearch=javascript –

12

Toute chance, il est le traitement de l'argument de chaîne comme UTC et l'objet Date résultant comme locale temps, ou vice versa? Cela pourrait le jeter. Comparez d.getDate() à d.getUTCDate().

0

http://jsbin.com/aqoki3/edit - ici avec le code que vous avez affiché, j'obtiens 21. Donc, ce n'est pas un bug JS. Peut-être son bug dans l'implémentation de votre navigateur (de JS).
Donc, 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). De cette façon, vous serez sûr que ce jour est 21 parce que vous l'avez implicitement mis à 21.

-2

Vous ne pouvez pas créer l'objet Date en passant l'argument de la chaîne comme la date.

Créer Comme ceci.

var str_date = "2010/03/21"; 
var date = new Date(); 
var date_elements = str_date.split("/"); 

date.setYear(date_elements[0]); 
date.setMonth(date_elements[1]); 
date.setDay(date_elements[2]); 

alert(date.toString); 

d'attirer l'attention sur la méthode date.toString. il renvoie la chaîne de date complète. date.getDate ne vous donnera que le jour de ce jour.

pour plus d'informations d'objet Date, reportez-vous www.w3school.com

+1

Vous * peut * créer des objets Date en transmettant des arguments de type chaîne qui ressemblent à des dates: https://developer.mozilla.org/fr/JavaScript/Reference/Global_Objects/Date#Parameters – akaihola

+1

devrait être 'date.setMonth (date_elements [1] -1 –

0

Je reçois la même date (21) Firfox, safari, chrome, opéra et IE, si j'utilise la chaîne « 2010/03/21 "ou les arguments de date entiers (2010,2,21).

J'utilise une version machine à fenêtres et nouvelles du browsers-

vous pouvez tester pour voir si votre client parse 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")); 
} 
4

Je reçois aussi un écart de 1 jour par getDate(), mais je constate que getUTCDate() renvoie la valeur attendue. Le problème a été vu dans FF 3.6.12, mais le même code fonctionnait sur Chrome.

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 3 novembre 2010: 3 UTC 4

Chrome est très bien. Donc quelque chose est en hausse quelque part - peut-être un bug, mais plus probablement un problème de paramètre timezone/UTC. Cela me rappelle où PHP date() retournera 23 heures dans un jour si le fuseau horaire a changé ce jour-là, etc ... Buggered si je sais ce que c'est, cependant.

+0

Si vous avez une NOUVELLE question, posez-la en cliquant sur le bouton [Poser une question] (http://stackoverflow.com/questions/ask). Si vous avez une réputation suffisante, [vous pouvez upvote] (http://stackoverflow.com/privileges/vote-up) la question. Alternativement, "star" en tant que favori et vous serez informé de toutes les nouvelles réponses. – Jack

24

Il s'agit d'un problème d'heure d'été, car Date() utilise l'heure locale. Je vis au Brésil et octobre-21-2012 est le début de l'heure d'été dans la plupart de mon pays, ainsi les dates locales au 21-oct. 2012 entre 0: 0 et 1: 0 n'existent pas au Brésil !

Certaines personnes commentent ici que cela fonctionne. Cela arrive parce que le bon ou mauvais retour d'heure 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 à Oct-14 (réellement commencer à 1 semaine plus tard)

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

produit et

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

La solution est UTC (Temps Universel Coordonné), car il n'y a pas de changements d'heure d'été et vous utilisez une sorte de temps abstrait. 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()); 

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

+0

Je suis d'accord que le problème a à voir avec DST mais vous avez fait des erreurs dans vos exemples. Rappelez-vous que dans javascript Date constructor mois commencent à 0, donc si vous voulez vous référer à Octobre 21-2012, vous devez créer: 'nouvelle date (2012,9,21);' – lboullo0

+0

Avez-vous raison, je l'ai corrigé. –

0

Assurez-vous du mois, lorsque créer

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

le mois de numéro que vous utilisez est -1, si vous êtes à la recherche à Juin, vous devez faire (6-1) Quand on donne une nouvelle date date de chaîne, la chaîne doit inclure le fuseau horaire, sinon il sera interprété différemment du navigateur à l'autre (en raison de différentes implémentations javascript) et de la machine à d'autres (en raison de la différence de fuseau horaire local)

new Date('2017-07-31T10:00:00-0500');

au lieu de

new Date('2017-07-31T10:00:00');

+1

Ajoutez des exemples de code pour plus de clarté concernant la question. –