856 votes

Comment convertir une date en UTC ?

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

2009-1-1 to 2009-1-3

Vous devez envoyer cette date à un serveur pour un certain traitement, mais le serveur s'attend à ce que toutes les dates et heures soient en UTC.

Supposons maintenant que l'utilisateur se trouve en Alaska. Comme il se trouve dans un fuseau horaire très 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

Utilisation du JavaScript Date comment convertir la première plage de dates "localisée" en quelque chose que le serveur comprendra ?

15 votes

J'ai ressuscité ce sujet parce que c'était le premier résultat de Google pour moi, et les navigateurs plus récents ont un support intégré pour les chaînes de dates UTC.

6 votes

J'ai mis à jour la réponse acceptée pour mettre en évidence la nouvelle méthode ECMAscript 5 toISOString(). Voir stackoverflow.com/a/11957822/19112

9 votes

Donc en 2015 je dois m'embrouiller avec la chaîne de caractères et l'analyse des dates ? ridicule !

735voto

DrunkCoder Points 2307

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);

111 votes

J'ai aimé votre idée et j'ai appliqué une méthode que j'ai utilisée à plusieurs reprises. function convertDateToUTC(date) { return new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds()); }

34 votes

Le code le plus court que j'ai trouvé pour obtenir la date et l'heure UTC est de supprimer le fuseau horaire : new Date(new Date().toUTCString().substr(0, 25))

1 votes

Peut-être now.setMinutes(now.getMinutes()+now.getTimezoneOffset()); o now.setUTCMinutes(now.getUTCMinutes()+now.getTimezoneOffset(‌​)); ? Ils semblent tous deux renvoyer la même chose.

588voto

Will Stern Points 1727

Le site toISOString() La méthode renvoie une chaîne de caractères en ISO étendu simplifié étendu simplifié ( ISO 8601 ), qui comporte toujours 24 ou 27 caractères. ( YYYY-MM-DDTHH:mm:ss.sssZ o ±YYYYYY-MM-DDTHH:mm:ss.sssZ , respectivement). Le fuseau horaire est toujours décalé de zéro UTC, comme indiqué par le suffixe " Z ".

Source : Documents Web du MDN

Le format dont vous avez besoin est créé avec l'option .toISOString() méthode. Pour les navigateurs plus anciens (ie8 et moins), qui ne supportent pas nativement cette méthode, la cale se trouve à l'adresse suivante aquí :

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

var isoDateString = new Date().toISOString();
console.log(isoDateString);

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

1 votes

J'ai maintenant marqué cette réponse comme étant la bonne, bien qu'il y ait des différences mineures dans le formatage des chaînes par rapport à ma question initiale. Le code de shim est utile pour les navigateurs qui n'implémentent pas encore la méthode ECMAscript 5 .toISOString().

180 votes

En fait, cela convertit l'objet date en une chaîne de caractères, il ne sera pas possible d'effectuer d'autres opérations sur la date.

6 votes

@TheRebel, le cas d'utilisation donné est qu'il a besoin d'envoyer au serveur une chaîne formatée.

264voto

Double Gras Points 2304

Voici ma méthode :

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

Le résultat utc n'est pas vraiment une date UTC, mais une date locale décalée pour correspondre à l'heure UTC (voir commentaires). Cependant, en pratique, cela fait l'affaire.

0 votes

Je regardais ce problème quand j'ai réalisé que Date.now() donne l'heure locale et non l'heure UTC, et cette solution me semble la plus simple. Du moins dans mon cas où je veux l'heure UNIX et non une chaîne joliment formatée. (la seule différence est que je multiplierais par 60 * 1000 juste pour être très clair :))

24 votes

L'ajout de 60000 * Date.getTimezoneOffset() est incorrect ! Tout d'abord, vous devez considérer que toutes les dates/heures sont déjà en UTC avec un modificateur de fuseau horaire à des fins d'affichage. Les navigateurs peuvent différer, mais Date.getTime() renvoie le nombre de millisecondes depuis 1970-01-01. Si vous créez une nouvelle date en utilisant ce nombre, ex : new Date(Date.getTime()) ; it sera UTC Cependant, lorsque vous l'affichez (par exemple, dans la console des outils de développement de chrome), il apparaît comme étant votre fuseau horaire local.

19 votes

Dans mon navigateur, cela crée un DateTime qui n'est pas UTC. Cependant, lorsqu'elle est affichée dans mon navigateur, elle affiche une date et une heure dans mon fuseau horaire local, qui serait l'heure UTC correcte si l'information sur le fuseau horaire était ignorée.

27voto

kennebec Points 33886
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(':');    
}

0 votes

Cela fonctionne bien. J'ai juste eu besoin de remplacer le "-" de mes dates sources par "/" afin de créer une date JavaScript, puis j'ai pu appeler votre fonction toISO() pour obtenir le résultat correct.

0 votes

Cela fonctionne très bien. Vous pouvez également introduire le résultat dans jQuery $.parseDate(...) pour récupérer un objet date qui a été décalé en UTC.

12voto

Madbreaks Points 8759

Je préfère cette approche :

var now = new Date();

var utc = new Date(Date.UTC(
    now.getFullYear(),
    now.getMonth(),
    now.getDate(),
    now.getHours(),
    now.getMinutes()
));

// now = Thu Mar 01 2012 06:28:00 GMT-0800 (PST)
// utc = Wed Feb 29 2012 22:28:00 GMT-0800 (PST)

Date.UTC() renvoie le nombre de millisecondes depuis l'époque, UTC.

Docs ici

Cheers

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