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?
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?
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
}
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
@ ferr-ie8 (et peut-être d'autres) ne reconnaissent pas les formats ISO 8601 et retourneront une date invalide. – RobG
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
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.
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
@Anubis: Je ne peux pas voir l'image que vous avez liée. –
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?
désolé! c'est 20 ici! http://www.kimag.es/share/84788221.png – VahidN
J'ai aussi testé sur jsbin et ça marche bien! il revient 21! ;-) –
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 –
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()
.
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.
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
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
devrait être 'date.setMonth (date_elements [1] -1 –
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"));
}
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.
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
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.
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
Avez-vous raison, je l'ai corrigé. –
Assurez-vous du mois, lorsque créer
var date_obj = new Date(y,(m-1),d);
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');
Ajoutez des exemples de code pour plus de clarté concernant la question. –
juste pour être sûr que je l'ai testé ici à la volée http://www.tlarson.com/script et dire 21 !!! –
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
Quelle est la langue/le pays de votre système d'exploitation? –