web-dev-qa-db-fra.com

L'objet date en Javascript est-il toujours un jour de congé?

Dans mon application Java Script, la date est stockée dans un format comme celui-ci:

2011-09-24

Maintenant, lorsque j'essaie d'utiliser la valeur ci-dessus pour créer un nouvel objet Date (afin de pouvoir récupérer la date dans un format différent), la date revient toujours un jour de congé. Voir ci-dessous:

var doo = new Date("2011-09-24");
console.log(doo);

journaux:

Fri Sep 23 2011 20:00:00 GMT-0400 (Eastern Daylight Time)
166
levi

Notez que l'heure avancée de l'Est est -4 hours et que les heures de la date de votre retour sont 20.

20h + 4h = 24h

qui est minuit du 24/09/2011.

Vous obtenez la bonne date, vous n’avez jamais spécifié le bon fuseau horaire.

Si vous devez accéder aux valeurs de date, vous pouvez utiliser getUTCDate() ou l'une des autres fonctions getUTC*() :

var d,
    days;
d = new Date('2011-09-24');
days = ['Sun', 'Mon', 'Tues', 'Wed', 'Thurs', 'Fri', 'Sat'];
console.log(days[d.getUTCDay()]);
83
zzzzBov

Il y a plusieurs choses folles qui se produisent avec un objet JS DATE qui convertit des chaînes, par exemple, considérez la date suivante que vous avez fournie.

Remarque: Les exemples suivants peuvent être ou non ONE DAY OFF en fonction de VOTRE _ FUSEAU HORAIRE et de l'heure actuelle.

new Date("2011-09-24"); // Year-Month-Day
// => Fri Sep 23 2011 17:00:00 GMT-0700 (MST) - ONE DAY OFF.

Cependant, si nous réorganisons le format de chaîne en Month-Day-Year ...

new Date("09-24-2011");
=> // Sat Sep 24 2011 00:00:00 GMT-0700 (MST) - CORRECT DATE.

Un autre étrange

new Date("2011-09-24");
// => Fri Sep 23 2011 17:00:00 GMT-0700 (MST) - ONE DAY OFF AS BEFORE.

new Date("2011/09/24"); // change from "-" to "/".
=> // Sat Sep 24 2011 00:00:00 GMT-0700 (MST) - CORRECT DATE.

Nous pourrions facilement changer les traits d'union dans votre date "2011-09-24" lors de la création d'une nouvelle date

new Date("2011-09-24".replace(/-/g, '\/')); // => "2011/09/24".
=> // Sat Sep 24 2011 00:00:00 GMT-0700 (MST) - CORRECT DATE.

Et si nous avions une chaîne de date du type "2011-09-24T00: 00: 00"

new Date("2011-09-24T00:00:00");
// => Fri Sep 23 2011 17:00:00 GMT-0700 (MST) - ONE DAY OFF.

Maintenant changez tiret en barre oblique comme auparavant; ce qui se produit?

new Date("2011/09/24T00:00:00");
// => Invalid Date

Je dois généralement gérer le format de date 2011-09-24T00: 00: 00, c'est donc ce que je fais.

new Date("2011-09-24T00:00:00".replace(/-/g, '\/').replace(/T.+/, ''));
// => Sat Sep 24 2011 00:00:00 GMT-0700 (MST) - CORRECT DATE.

METTRE À JOUR

Si vous fournissez des arguments distincts au constructeur Date, vous pouvez obtenir d'autres sorties utiles, comme décrit ci-dessous.

Remarque: les arguments peuvent être de type Number ou String. Je vais montrer des exemples avec des valeurs mixtes.

Obtenez le premier mois et le premier jour d'une année donnée

new Date(2011, 0); // Normal behavior as months in this case are zero based.
=> // Sat Jan 01 2011 00:00:00 GMT-0700 (MST)

Obtenez le dernier mois et le dernier jour de l'année

new Date((2011 + 1), 0, 0); // The second zero roles back one day into the previous month's last day.
=> // Sat Dec 31 2011 00:00:00 GMT-0700 (MST)

Exemple de nombre, arguments de chaîne. Notez que le mois est mars parce que les mois sont à zéro.

new Date(2011, "02"); 
=> // Tue Mar 01 2011 00:00:00 GMT-0700 (MST)

Si nous faisons la même chose mais avec un jour de zéro, nous obtenons quelque chose de différent.

new Date(2011, "02", 0); // again the zero roles back from March to the last day of February.
=> // Mon Feb 28 2011 00:00:00 GMT-0700 (MST)

Ajouter un jour de zéro à n'importe quel argument année/mois donnera le dernier jour du mois précédent. Si vous continuez avec des nombres négatifs, vous pouvez continuer d'annuler un autre jour.

new Date(2011, "02", -1);
=> // Sun Feb 27 2011 00:00:00 GMT-0700 (MST)
165
SoEzPz

Pour normaliser la date et éliminer le décalage indésirable (testé ici: https://jsfiddle.net/7xp1xL5m/ ):

var doo = new Date("2011-09-24");
console.log(  new Date( doo.getTime() + Math.abs(doo.getTimezoneOffset()*60000) )  );
// Output: Sat Sep 24 2011 00:00:00 GMT-0400 (Eastern Daylight Time)

Ceci accomplit également la même chose et le mérite de @tpartee (testé ici: https://jsfiddle.net/7xp1xL5m/1/ ): 

var doo = new Date("2011-09-24");
console.log( new Date( doo.getTime() - doo.getTimezoneOffset() * -60000 )  );
61
AaronLS

Si vous souhaitez obtenir l'heure 0 d'une certaine date dans le fuseau horaire local, transmettez les parties de date individuelles au constructeur Date.

new Date(2011,08,24); // month value is 0 based, others are 1 based.
25
lincolnk

Je veux juste ajouter qu'apparemment, ajouter un espace à la fin de la chaîne utilisera UTC pour la création.

new Date("2016-07-06")
> Tue Jul 05 2016 17:00:00 GMT-0700 (Pacific Daylight Time)

new Date("2016-07-06 ")
> Wed Jul 06 2016 00:00:00 GMT-0700 (Pacific Daylight Time)

Edit: Ce n'est pas une solution recommandée, juste une réponse alternative. S'il vous plaît, n'utilisez pas cette approche car il est très difficile de savoir ce qui se passe. Il y a un certain nombre de façons dont une personne pourrait refactoriser ceci causant accidentellement un bogue.

18
Kyle Shrader

Je crois que cela a à voir avec l'ajustement du fuseau horaire. La date que vous avez créée est à l'heure GMT et l'heure par défaut est minuit, mais votre fuseau horaire est à l'heure avancée de l'Est. Il soustrait 4 heures. Essayez ceci pour vérifier:

var doo = new Date("2011-09-25 EDT");
14
FishBasketGordo

Votre problème concerne spécifiquement le fuseau horaire. Notez la partie GMT-0400 - c'est-à-dire que vous avez 4 heures de retard sur l'heure GMT. Si vous ajoutez 4 heures à la date/heure affichée, vous aurez exactement minuit le 24/09/2011. Utilisez la méthode toUTCString() à la place pour obtenir la chaîne GMT:

var doo = new Date("2011-09-24");
console.log(doo.toUTCString());
10
Aleks G

Ceci à travers moi pour une boucle, +1 sur la réponse de zzzBov. Voici une conversion complète d'une date qui a fonctionné pour moi en utilisant les méthodes UTC:

//myMeeting.MeetingDate = '2015-01-30T00:00:00'

var myDate = new Date(myMeeting.MeetingDate);
//convert to JavaScript date format
//returns date of 'Thu Jan 29 2015 19:00:00 GMT-0500 (Eastern Standard Time)' <-- One Day Off!

myDate = new Date(myDate.getUTCFullYear(), myDate.getUTCMonth(), myDate.getUTCDate());
//returns date of 'Fri Jan 30 2015 00:00:00 GMT-0500 (Eastern Standard Time)' <-- Correct Date!
5
cmartin

Cela signifie 2011-09-24 00:00:00 GMT, et puisque vous êtes à GMT -4, ce sera 20:00 la veille.

Personnellement, je reçois 2011-09-24 02:00:00, car je vis à GMT +2.

4
pimvdb

Ce n'est probablement pas une bonne réponse, mais je veux juste partager mon expérience avec ce problème.

Mon application utilise globalement date utc au format 'AAAA-MM-JJ', alors que le plugin datepicker que j'utilise n'accepte que la date js, il m'est difficile de prendre en compte à la fois utc et js. Donc, quand je veux passer une date formatée 'AAAA-MM-JJ' à mon datepicker, je la convertis d'abord au format 'MM/JJ/AAAA' en utilisant moment.js ou ce que vous voulez, et la date affichée sur datepicker est maintenant correct. Pour votre exemple

var d = new Date('2011-09-24'); // d will be 'Fri Sep 23 2011 20:00:00 GMT-0400 (EDT)' for my lacale
var d1 = new Date('09/24/2011'); // d1 will be 'Sat Sep 24 2011 00:00:00 GMT-0400 (EDT)' for my lacale

Apparemment, d1 est ce que je veux. J'espère que cela serait utile pour certaines personnes.

4
Jie Zhang

Bien que, dans le cas du PO, le fuseau horaire soit EDT, rien ne garantit que l'utilisateur exécutant votre script sera dans le fuseau horaire EDT. Par conséquent, coder en dur le décalage ne fonctionnera pas nécessairement. La solution que j'ai trouvée scinde la chaîne de date et utilise les valeurs distinctes du constructeur Date.

var dateString = "2011-09-24";
var dateParts = dateString.split("-");
var date = new Date(dateParts[0], dateParts[1] - 1, dateParts[2]);

Notez que vous devez prendre en compte un autre élément étrange de JS: le mois est basé sur zéro.

2
Brian Risk

J'ai rencontré un problème comme celui-ci. Mais mon problème était le décalage tout en obtenant la date de la base de données.

ceci est tracé dans la base de données et au format UTC.

2019-03-29 19: 00: 00.0000000 +00: 00

Donc, quand je reçois de la base de données et que je vérifie la date, il ajoute un décalage avec elle et le renvoie à javascript.

 enter image description here 

Il ajoute +05: 00 car il s'agit du fuseau horaire de mon serveur. Mon client est sur un fuseau horaire différent +07: 00.

2019-03-28T19: 00: 00 + 05: 00 // c'est ce que j'obtiens en javascript.

Alors voici ma solution ce que je fais avec ce problème.

var dates = price.deliveryDate.split(/-|T|:/);
var expDate = new Date(dates[0], dates[1] - 1, dates[2], dates[3], dates[4]);
var expirationDate = new Date(expDate);

Donc, lorsque la date provient du serveur et que le serveur est décalé, je scissionne donc la date et supprime le décalage serveur, puis convertis en date. Cela résout mon problème.

1
Uxmaan Ali

La meilleure façon de gérer cela sans utiliser plus de méthodes de conversion,

 var mydate='2016,3,3';
 var utcDate = Date.parse(mydate);
 console.log(" You're getting back are 20.  20h + 4h = 24h :: "+utcDate);

Maintenant, ajoutez simplement GMT à votre date ou vous pouvez l’ajouter.

 var  mydateNew='2016,3,3'+ 'GMT';
 var utcDateNew = Date.parse(mydateNew);
 console.log("the right time that you want:"+utcDateNew)

Live: https://jsfiddle.net/gajender/2kop9vrk/1/

1
Gajender Singh

Vous utilisez le format de chaîne de date ISO qui, selon cette page , provoque la construction de la date à l'aide du fuseau horaire UTC:

Remarque: l'analyse des chaînes de date avec le constructeur Date (et Date.parse, elles sont équivalentes) est fortement déconseillée en raison de différences et incohérences de navigateur. Prise en charge du format RFC 2822 strings est par convention seulement. La prise en charge des formats ISO 8601 diffère en les chaînes de date uniquement (par exemple, "1970-01-01") sont traitées comme des UTC, pas local.

Si vous formatez le texte différemment, tel que "Jan 01 1970", alors (au moins sur ma machine), il utilise votre fuseau horaire local. 

0
PaulrBear

J'ai rencontré ce problème précis lorsque mon client était à l'heure normale de l'Atlantique. La valeur de date que le client a récupérée était "2018-11-23" et lorsque le code l'a transmis à new Date("2018-11-23"), la sortie du client était pour le jour précédent. J'ai créé une fonction utilitaire, comme indiqué dans l'extrait de code qui a normalisé la date, en donnant au client la date prévue.

date.setMinutes(date.getMinutes() + date.getTimezoneOffset());

var normalizeDate = function(date) {
  date.setMinutes(date.getMinutes() + date.getTimezoneOffset());
  return date;
};

var date = new Date("2018-11-23");

document.getElementById("default").textContent = date;
document.getElementById("normalized").textContent = normalizeDate(date);
<h2>Calling new Date("2018-11-23")</h2>
<div>
  <label><b>Default</b> : </label>
  <span id="default"></span>
</div>
<hr>
<div>
  <label><b>Normalized</b> : </label>
  <span id="normalized"></span>
</div>
0
Gabriel Gates