Question Comment convertir une date JavaScript en UTC?


Supposons qu'un utilisateur de votre site Web entre dans une plage de dates.

2009-1-1 to 2009-1-3

Vous devez envoyer cette date à un serveur pour un traitement, mais le serveur attend que toutes les dates et heures soient au format UTC.

Supposons maintenant que l'utilisateur se trouve en Alaska, à Hawaii ou à Fidji. Comme ils se trouvent dans un fuseau horaire assez différent de l’UTC, la plage de dates doit être convertie en quelque chose comme ceci:

2009-1-1T8:00:00 to 2009-1-4T7:59:59

En utilisant l’objet JavaScript Date, comment convertissez-vous la première plage de dates "localisée" en quelque chose que le serveur comprendra?


422
2018-06-04 03:54


origine


Réponses:


Le format dont vous avez besoin est créé avec .toISOString() méthode. Pour les navigateurs plus anciens (ie8 et moins), qui ne supportent pas nativement cette méthode, le shim peut être trouvé ici:

Cela vous donnera la possibilité de faire ce dont vous avez besoin:

var isoDate = new Date('yourdatehere').toISOString();

Pour le travail Timezone, moment.js et moment.js fuseau horaire sont des outils vraiment précieux ... surtout pour naviguer dans les fuseaux horaires entre le client et le serveur javascript.


260
2017-08-14 17:43



Simple et stupide

var date = new Date(); 
var now_utc =  Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(),
 date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds());

 return new Date(now_utc);

464
2017-07-21 14:14



Voici ma méthode:

var now = new Date();
var utc = new Date(now.getTime() + now.getTimezoneOffset() * 60000);

La résultante utc objet n'est pas vraiment une date UTC, mais une date locale décalée pour correspondre à l'heure UTC (voir les commentaires). Cependant, en pratique, il fait le travail.


136
2017-08-15 05:41



Date.prototype.toUTCArray= function(){
    var D= this;
    return [D.getUTCFullYear(), D.getUTCMonth(), D.getUTCDate(), D.getUTCHours(),
    D.getUTCMinutes(), D.getUTCSeconds()];
}

Date.prototype.toISO= function(){
    var tem, A= this.toUTCArray(), i= 0;
    A[1]+= 1;
    while(i++<7){
        tem= A[i];
        if(tem<10) A[i]= '0'+tem;
    }
    return A.splice(0, 3).join('-')+'T'+A.join(':');    
}

24
2018-06-04 04:20



Convertir en ISO sans changer la date et l'heure

var now = new Date(); // Fri Feb 20 2015 19:29:31 GMT+0530 (India Standard Time) 
var isoDate = new Date(now.getTime() - now.getTimezoneOffset() * 60000).toISOString();
//OUTPUT : 2015-02-20T19:29:31.238Z

Convertir en ISO avec changement de date / heure (la date / heure sera modifiée)

isoDate = new Date(now).toISOString();
//OUTPUT : 2015-02-20T13:59:31.238Z 

Fiddle link


16
2018-02-20 14:00



Les navigateurs peuvent différer, et vous devriez également ne pas faire confiance aux informations générées par le client, cela étant dit, l'instruction ci-dessous fonctionne pour moi (Google Chrome v24 sur Mac OS X 10.8.2)

var utcDate = new Date(new Date().getTime());


edit: "Comment est-ce différent de juste new Date()?" vois ici: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date

  • Si aucun argument n'est fourni, le constructeur crée un objet Date JavaScript pour la date et l'heure actuelles en fonction des paramètres système.
  • Remarque: Lorsque Date est appelée en tant que constructeur avec plus d'un argument, les arguments spécifiés représentent l'heure locale. Si vous souhaitez utiliser l'UTC, utilisez la nouvelle date (Date.UTC (...)) avec les mêmes arguments. (note: Date.UTC () renvoie le nombre de millisecondes depuis 1970-01-01 00:00:00 UTC)

L'ajout du 60000 * Date.getTimezoneOffset () comme indiqué dans les réponses précédentes est incorrect. Tout d'abord, vous devez penser à toutes les dates / heures comme étant déjà UTC avec un modificateur de fuseau horaire à des fins d'affichage.

Encore une fois, les navigateurs peuvent différer, cependant, Date.getTime () renvoie le nombre de millisecondes depuis 1970-01-01 UTC / GMT. Si vous créez une nouvelle date en utilisant ce numéro comme je le fais ci-dessus, ce sera UTC / GMT. Cependant, si vous l'affichez en appelant .toString (), il apparaîtra dans votre fuseau horaire local car .toString () utilise votre fuseau horaire local, et non le fuseau horaire de l'objet Date sur lequel il est appelé.

J'ai également trouvé que si vous appelez .getTimezoneOffset () sur une date, il retournera votre fuseau horaire local, pas le fuseau horaire de l'objet de date que vous avez appelé (je ne peux pas vérifier ceci pour être standard cependant).

Dans mon navigateur, l’ajout de 60000 * Date.getTimezoneOffset () crée un DateTime pas UTC. Cependant, lorsqu'il est affiché dans mon navigateur (ex: .toString ()), il affiche un DateTime dans mon fuseau horaire local qui correspond à l'heure UTC si les informations de fuseau horaire sont ignorées.


16
2018-01-30 17:52



var myDate = new Date(); // Set this to your date in whichever timezone.
var utcDate = myDate.toUTCString();

10
2018-06-04 03:59



Essayez-vous de convertir la date en une chaîne comme celle-ci?

Je ferais une fonction pour le faire et, bien que ce soit légèrement controversé, ajoutez-le au prototype Date. Si vous n'êtes pas à l'aise avec cela, vous pouvez le mettre en tant que fonction autonome, en passant la date en paramètre.

Date.prototype.getISOString = function() {
    var zone = '', temp = -this.getTimezoneOffset() / 60 * 100;
    if (temp >= 0) zone += "+";
    zone += (Math.abs(temp) < 100 ? "00" : (Math.abs(temp) < 1000 ? "0" : "")) + temp;

    // "2009-6-4T14:7:32+10:00"
    return this.getFullYear()   // 2009
         + "-"
         + (this.getMonth() + 1) // 6
         + "-"
         + this.getDate()       // 4
         + "T"
         + this.getHours()      // 14
         + ":"
         + this.getMinutes()    // 7
         + ":"
         + this.getSeconds()    // 32
         + zone.substr(0, 3)    // +10
         + ":"
         + String(temp).substr(-2) // 00
    ;
};

Si vous en aviez besoin en heure UTC, remplacez simplement toutes les fonctions get * par getUTC *, par exemple: getUTCFullYear, getUTCMonth, getUTCHours ... et ajoutez simplement "+00: 00" à la fin au lieu du décalage du fuseau horaire de l'utilisateur.


7
2018-06-04 04:10