239 votes

Analyse de la date sans fuseau horaire en javascript

Je veux analyser une date sans fuseau horaire en JavaScript. J'ai essayé :

new Date(Date.parse("2005-07-08T00:00:00+0000"));

Qui a retourné Fri Jul 08 2005 02:00:00 GMT+0200 (heure d'été de l'Europe centrale) :

new Date(Date.parse("2005-07-08 00:00:00 GMT+0000"));

renvoie le même résultat et :

new Date(Date.parse("2005-07-08 00:00:00 GMT-0000"));

renvoie également le même résultat.

Je veux analyser le temps :

  1. sans fuseau horaire.
  2. sans appeler un constructeur Date.UTC ou nouveau Date(year, month, day) .
  3. en passant simplement une chaîne dans le constructeur de Date (sans approche de prototype).

Je dois produire un objet Date, pas un String.

202voto

wawka Points 237

J'ai le même problème. J'obtiens une date sous forme de String, par exemple : '2016-08-25T00:00:00', mais j'ai besoin d'avoir un objet Date avec l'heure correcte. Pour convertir la chaîne en objet, j'utilise getTimezoneOffset :

var date = new Date('2016-08-25T00:00:00')
var userTimezoneOffset = date.getTimezoneOffset() * 60000;
new Date(date.getTime() - userTimezoneOffset);

getTimezoneOffset() retournera une valeur négative ou positive. Elle doit être soustraite pour fonctionner dans tous les endroits du monde.

169voto

georg Points 52691

La date est analysée correctement, c'est juste que toString qui le convertit dans votre fuseau horaire local :

let s = "2005-07-08T11:22:33+0000";
let d = new Date(Date.parse(s));

// this logs for me 
// "Fri Jul 08 2005 13:22:33 GMT+0200 (Central European Summer Time)" 
// and something else for you

console.log(d.toString()) 

// this logs
// Fri, 08 Jul 2005 11:22:33 GMT
// for everyone

console.log(d.toUTCString())

Les objets Date de Javascript sont des timestamps - ils contiennent simplement un nombre de millisecondes depuis l'époque. Il n'y a pas d'information sur le fuseau horaire dans un objet Date. La date du calendrier (jour, minutes, secondes) que ce timestamp représente est une question d'interprétation (l'un des éléments suivants to...String méthodes).

L'exemple ci-dessus montre que la date est analysée correctement, c'est-à-dire qu'elle contient effectivement un nombre de millisecondes correspondant à "2005-07-08T11:22:33" en GMT.

18voto

Iwnnay Points 21

J'ai rencontré le même problème, puis je me suis souvenu de quelque chose de louche à propos d'un ancien projet sur lequel je travaillais et de la façon dont ils avaient traité cette question. Je ne l'ai pas compris à l'époque et je ne m'en suis pas vraiment soucié jusqu'à ce que je rencontre moi-même ce problème.

var date = '2014-01-02T00:00:00.000Z'
date = date.substring(0,10).split('-')
date = date[1] + '-' + date[2] + '-' + date[0]

new Date(date) #Thu Jan 02 2014 00:00:00 GMT-0600

Pour une raison quelconque, le fait d'entrer la date sous la forme "01-02-2014" met le fuseau horaire à zéro et ignore le fuseau horaire de l'utilisateur. Il s'agit peut-être d'une erreur de la classe Date, mais ce problème existait déjà il y a quelque temps et existe encore aujourd'hui. Et il semble fonctionner sur tous les navigateurs. Essayez-le par vous-même.

Ce code est mis en œuvre dans un projet global où les fuseaux horaires ont une grande importance mais où la personne qui regarde la date ne se soucie pas du moment exact où elle a été introduite.

18voto

John Galt Points 954

Puisqu'il s'agit d'un problème de formatage lors de l'affichage de la date (par exemple, l'affichage en heure locale), j'aime utiliser la nouvelle version de l'interface. Intl.DateTimeFormat pour effectuer le formatage, car il est plus explicite et offre davantage d'options de sortie :

const dateOptions = { timeZone: 'UTC', month: 'long', day: 'numeric', year: 'numeric' };

const dateFormatter = new Intl.DateTimeFormat('en-US', dateOptions);
const dateAsFormattedString = dateFormatter.format(new Date('2019-06-01T00:00:00.000+00:00'));

console.log(dateAsFormattedString) // "June 1, 2019"

Comme on le voit, en fixant le timeZone sur 'UTC', il n'effectuera pas de conversions locales. En prime, cela vous permet également de créer des sorties plus soignées. Vous pouvez en savoir plus sur le Intl.DateTimeFormat objet dans Mozilla - Intl.DateTimeFormat .

La même fonctionnalité peut être réalisée sans créer une nouvelle Intl.DateTimeFormat objet. Il suffit de passer les options de locale et de date directement dans l'objet toLocaleDateString() fonction.

const dateOptions = { timeZone: 'UTC', month: 'long', day: 'numeric', year: 'numeric' };
const myDate = new Date('2019-06-01T00:00:00.000+00:00');
myDate.toLocaleDateString('en-US', dateOptions); // "June 1, 2019"

13voto

K__lite Points 81

J'ai trouvé JavaScript Date Object et Time Zones | Correction d'un bug "décalage d'un jour". sur YouTube. Cela corrige/réinitialise le décalage pour le fuseau horaire local. La vidéo contient une excellente explication de ce problème.

// date as YYYY-MM-DDT00:00:00Z

let dateFormat = new Date(date)

// Methods on Date Object will convert from UTC to users timezone
// Set minutes to current minutes (UTC) + User local time UTC offset

dateFormat.setMinutes(dateFormat.getMinutes() + dateFormat.getTimezoneOffset())

// Now we can use methods on the date obj without the timezone conversion

let dateStr = dateFormat.toDateString();

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X