2017-10-10 1 views
2

J'ai une application angular.js, et je veux obtenir les dates de lundi et dimanche de la semaine en cours, qui sont ensuite définies par défaut sur les dates du calendrier. Je regardais une erreur due aux dates produites ne tombant pas dans les 7 jours de durée. J'ai corrigé le problème. Mais comme je jouais avec le code, j'ai découvert que, code de création de date similaire produisait des valeurs différentes pour l'heure. Voici un extrait de mon code:Javascript new Fonction Date produisant différentes valeurs d'heures pour deux appels de fonction similaires

var current = new Date(); // get current date  
 
var weekstart = current.getDate() - current.getDay() + 1; 
 
var weekend = weekstart + 6; // end day is the first day + 6 
 
var firstday = new Date(current.setDate(weekstart)); 
 
firstday = new Date(firstday.getFullYear() + '-' + (firstday.getMonth() + 1) 
 
        + '-' + firstday.getDate()); 
 
console.log("Monday: " + firstday); 
 

 
//firstday.setHours(0, 0, 0, 0); 
 
var last = new Date(firstday); 
 
last.setDate(last.getDate() + 6); 
 
console.log("Sunday 1: " + last); 
 
var lastday = new Date(last.getFullYear() + '-' + (last.getMonth() + 1) 
 
         + '-' + last.getDate()); 
 
console.log("Sunday 2: " + lastday);

Voici les valeurs générées dans la console:

Monday: Mon Oct 09 2017 00:00:00 GMT+1100 (AUS Eastern Daylight Time) 
Sunday 1: Sun Oct 15 2017 00:00:00 GMT+1100 (AUS Eastern Daylight Time) 
Sunday 2: Sun Oct 15 2017 11:00:00 GMT+1100 (AUS Eastern Daylight Time)  

Pourquoi le champ Heure de dimanche 2 se produit en 11, alors qu'un nouvel appel de date semblable pour lundi a donné lieu à 00?

+2

Aucune idée pourquoi cela se passe, mais vous pourriez peut-être utiliser la 'nouvelle date (année, mois, date)' constructeur au lieu d'éviter l'ambiguïté. – H77

Répondre

3
new Date('2017-10-9') 
2017-10-08T16:00:00.000Z 
> new Date('2017-10-15') 
2017-10-15T00:00:00.000Z 
> new Date('2017-10-09') 
2017-10-09T00:00:00.000Z 

La différence est supposé fuseau horaire.

2017-10-09 suppose le fuseau horaire UTC, tandis que 2017-10-9 suppose le fuseau horaire local.

Les différences dans le fuseau horaire d'une chaîne supposée date de « 7 Mars, 2014 », analyser() prend un fuseau horaire local, mais étant donné un format ISO tel que « 07/03/2014 », il supposons un fuseau horaire de l'UTC (ES5 et ECMAScript 2015).

Dans mon cas, le fuseau horaire est +8, donc l'heure diffère de 8 heures. Dans votre cas, c'est +11.

Vérifiez https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse pour plus de détails

+1

Mais le texte que vous citez parle d'un format de chaîne de date que l'OP n'utilise pas. La différence dans l'entrée avec le code de cette question est '9' versus' 09' pour la date - pourquoi cela affecterait-il le temps dans la sortie? – nnnnnn

+1

@nnnnnn Date.parse() suppose un fuseau horaire différent pour un format différent de dateString. –

+1

yup. il indique ** Cela signifie que deux chaînes de date qui semblent équivalentes peuvent entraîner deux valeurs différentes selon le format de la chaîne en cours de conversion. ** – roshan

-1

Lire this

Note: l'analyse syntaxique des chaînes de date avec le constructeur Date (et Date.parse, ils sont équivalents) est fortement déconseillée en raison des différences de navigateur et les incohérences. La prise en charge des chaînes de format RFC 2822 est uniquement conventionnelle. La prise en charge des formats ISO 8601 diffère en ce que les chaînes de date seule (par exemple, "1970-01-01") sont traitées en UTC et non en local.

+0

@ nnnnnn- ... ;-) – RobG

+1

Une référence n'est pas une réponse, il pourrait être un commentaire utile pensé. – RobG