web-dev-qa-db-fra.com

Comment convertir une date JavaScript en UTC?

Supposons qu'un utilisateur de votre site Web entre 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, à Hawaii ou à Fidji. Comme ils se trouvent dans un fuseau horaire très différent de UTC, la plage de dates doit être convertie de la manière suivante:

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

À l'aide de l'objet Date JavaScript, comment convertiriez-vous la première plage de dates "localisée" en une information que le serveur comprendra?

469
dthrasher

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

Source: Documents Web MDN

Le format dont vous avez besoin est créé avec la méthode .toISOString(). 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 fuseau horaire, les commandes moment.js et moment.js sont des outils vraiment précieux ... surtout pour la navigation entre les fuseaux horaires entre le javascript du client et celui du serveur.

306
Will Stern

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

Voici ma méthode:

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

L'objet utc résultant n'est pas vraiment une date UTC, mais une date locale décalée pour correspondre à l'heure UTC (voir les commentaires). Cependant, dans la pratique, cela fait le travail.

157
Gras Double
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
kennebec

Convertir en ISO sans changer la date/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 lien

20
RollerCosta

Les navigateurs peuvent différer et vous devez également vous rappeler de 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: "En quoi est-ce différent de new Date()?" voir 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é en tant que constructeur avec plusieurs arguments, les arguments spécifiés représentent l'heure locale. Si vous le souhaitez, utilisez la nouvelle date ( Date.UTC (...) ) avec les mêmes arguments. (note: Date.UTC () renvoie le nombre de millisecondes depuis le 1970-01-01 00:00:00 UTC)

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

Là encore, les navigateurs peuvent différer. Cependant, Date.getTime () renvoie le nombre de millisecondes écoulées depuis le 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. Toutefois, 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 constaté que si vous appelez .getTimezoneOffset () à une date, il vous renverra votre fuseau horaire local, et non le fuseau horaire de l'objet de date sur lequel vous l'avez appelé (je ne peux toutefois pas vérifier si cela est standard).

Dans mon navigateur, l'ajout de 60000 * Date.getTimezoneOffset () crée un DateTime qui est et non 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 correcte si les informations relatives au fuseau horaire sont ignorées.

18
Aaron Hoffman
var myDate = new Date(); // Set this to your date in whichever timezone.
var utcDate = myDate.toUTCString();
12
James Skidmore

Essayez-vous de convertir la date en une chaîne de ce type?

Je ferais une fonction pour le faire et, bien que cela soit légèrement controversé, je l'ajouterais au prototype Date. Si vous n'êtes pas à l'aise avec cela, vous pouvez le définir comme une fonction autonome, en passant la date comme 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 toutes les fonctions get * par getUTC *, par exemple: getUTCFullYear, getUTCMonth, getUTCHours ... et ajoutez simplement "+00: 00" à la fin du décalage horaire de l'utilisateur.

7
nickf
date = '2012-07-28'; stringdate = new Date(date).toISOString();

devrait fonctionner dans la plupart des nouveaux navigateurs. il retourne 2012-07-28T00:00:00.000Z sur Firefox 6.0

7
jcomeau_ictx

Lorsque je travaille avec des dates, je vous recommande d’analyser la date dans des champs individuels à partir de la saisie de l’utilisateur. Vous pouvez l'utiliser comme une chaîne complète, mais vous jouez avec le feu.

JavaScript peut traiter deux dates égales dans des formats différents différemment.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse

Ne faites jamais rien comme:

new Date('date as text');

Une fois que vous avez analysé la date dans ses champs individuels à partir de la saisie de l'utilisateur, créez un objet de date. Une fois l’objet Date créé, convertissez-le en UTC en ajoutant le décalage de fuseau horaire. Je ne peux pas souligner combien il est important d'utiliser le décalage par rapport à l'objet de date en raison de l'heure d'été (une autre discussion cependant pour montrer pourquoi).

var year = getFullYear('date as text');
var month = getMonth('date as text');
var dayOfMonth = getDate('date as text');

var date = new Date(year, month, dayOfMonth);

var offsetInMs = ((date.getTimezoneOffset() * 60)  // Seconds
                 * 1000);                          //  Milliseconds

var utcDate = new Date(date.getTime + offsetInMs);

Vous pouvez maintenant transmettre la date au serveur en heure UTC. Encore une fois, je recommanderais fortement de ne pas utiliser de chaîne de date. Soit le transmettre au serveur avec la granularité la plus basse dont vous avez besoin, par exemple. année, mois, jour, minute ou en valeur, en millisecondes, à partir de l’époque unix.

7
Timothy Gonzalez

Si vous avez beaucoup de rendez-vous, utilisez moment.js ( http://momentjs.com ). La méthode pour convertir en UTC serait:

moment(yourTime).utc()

Vous pouvez utiliser le format pour changer votre date en un format de votre choix:

moment(yourTime).utc().format("YYYY-MM-DD")

Il existe également des options de décalage, mais il existe une bibliothèque complémentaire supplémentaire pour gérer le fuseau horaire ( http://momentjs.com/timezone/ ). La conversion de temps serait aussi simple que cela:

moment.tz(yourUTCTime, "America/New_York")
5
iMad

Une autre solution pour convertir en UTC et le conserver en tant qu’objet de date: (Cela supprime la partie "GMT" de la fin de la chaîne formatée, puis la replace dans le constructeur Date).

var now = new Date();
var now_utc = new Date(now.toUTCString().slice(0, -4));

J'avais besoin de faire cela pour me connecter à une bibliothèque de sélecteur de date/heure. Mais en général, travailler avec des dates de cette manière est une mauvaise idée.

Les utilisateurs veulent généralement travailler avec les heures de l'heure locale. Vous devez donc mettre à jour le code côté serveur pour analyser correctement les chaînes datetime avec des décalages, puis convertir au format UTC (meilleure option) ou le convertir en chaîne UTC côté client avant de l'envoyer au serveur. serveur (comme dans la réponse de Will Stern)

5
CMcClymont

J'ai trouvé que le jQuery Globalization Plugin l'analyse de la date fonctionnait mieux. D'autres méthodes présentaient des problèmes inter-navigateurs et des éléments tels que date.js n'avaient pas été mis à jour depuis longtemps. 

Vous n'avez également pas besoin d'un datePicker sur la page. Vous pouvez simplement appeler quelque chose de similaire à l'exemple donné dans la documentation:

$.parseDate('yy-mm-dd', '2007-01-26');
4
Brian Ellis

Je viens de découvrir que la version 1.2.3 de date.format.js de Steven Levithan fait exactement ce que je veux. Il vous permet de fournir une chaîne de format pour une date JavaScript et convertira l'heure locale en heure UTC. Voici le code que j'utilise maintenant:

// JavaScript dates don't like hyphens!    
var rectifiedDateText = dateText.replace(/-/g, "/");
var d = new Date(rectifiedDateText);

// Using a predefined mask from date.format.js.
var convertedDate = dateFormat(d, 'isoUtcDateTime'); 
4
dthrasher

Cette fonction fonctionne à merveille pour moi.

function ParseDateForSave(dateValue) {
    // create a new date object
    var newDate = new Date(parseInt(dateValue.substr(6)));

    // return the UTC version of the date
    return newDate.toISOString();
}
3
Will Strohl
var userdate = new Date("2009-1-1T8:00:00Z");
var timezone = userdate.getTimezoneOffset();
var serverdate = new Date(userdate.setMinutes(userdate.getMinutes()+parseInt(timezone)));

Cela vous donnera la date et l'heure UTC appropriées.
C'est parce que getTimezoneOffset() vous donnera la différence de fuseau horaire en minutes . Je vous recommande de ne pas utiliser toISOString() car la sortie sera dans la chaîne.

1
Sanket Patel

En examinant votre question, vous constaterez clairement que vous souhaitez simplement envoyer la plage de dates à votre serveur pour un traitement ultérieur.

Je suppose que vous vous conformez aux directives de données standard qui prévoient que les données seront dans un format particulier. Par exemple, j'utilise ODATA, une API RESTfull qui attend les objets date-heure au format suivant: -

AAAA-MM-JJT00: 00: 00.

Cela peut être facilement réalisé via l'extrait de code affiché ci-dessous (veuillez modifier le format selon vos besoins). 

var mydate;//assuming this is my date object which I want to expose var UTCDateStr = mydate.getUTCFullYear() + "-" + mydate.getUTCMonth() + "-" + mydate.getUTCDate() + "T00:00:00";

Par contre, si vous êtes dans ma situation, vous avez reçu une date de votre backend et le navigateur la convertit en votre date locale. Par contre, vous êtes intéressé par la date UTC, vous pouvez alors: -

var mydate;//assuming this is my date object which I want to expose var UTCDate = new Date(mydate);/*create a copy of your date object. Only needed if you for some reason need the original local date*/ UTCDate.setTime(UTCDate.getTime() + UTCDate.getTimezoneOffset() * 60 * 1000);

L'extrait de code ci-dessus ajoute essentiellement/soustrait le temps ajouté/soustrait par le navigateur en fonction du fuseau horaire. 

Par exemple, si je suis dans EST (GMT-5) et que mon service renvoie un objet date-heure = mercredi 17 août 2016 00:00:00 GMT-0500mon navigateur soustrait automatiquement le décalage du fuseau horaire (5h) pour que mon temps. Donc, si j'essaie de récupérer l'heure, je reçois le mercredi 16 août 2016 19:00:00 GMT-0500. Cela pose beaucoup de problèmes. Il existe de nombreuses bibliothèques qui faciliteront certainement les choses, mais je voulais partager l'approche JS pure. 

Pour plus d'informations, veuillez consulter: http://praveenlobo.com/blog/how-to-convert-javascript-local-date-to-utc-and-utc-to-local-date/ où dans j'ai eu mon inspiration.

J'espère que cela t'aides!

1
Reeth

C'est ce que j'ai fait par le passé:

var utcDateString = new Date(new Date().toUTCString()).toISOString();
1
Pradyumna Das

Cette méthode vous donnera: 2017-08-04T11:15:00.000+04:30 et vous pouvez ignorer zone variable pour obtenir simplement 2017-08-04T11:15:00.000.

function getLocalIsoDateTime(dtString) {
    if(dtString == "")
        return "";
    var offset = new Date().getTimezoneOffset();
    var localISOTime = (new Date(new Date(dtString) - offset * 60000 /*offset in milliseconds*/)).toISOString().slice(0,-1);
    //Next two lines can be removed if zone isn't needed.
    var absO = Math.abs(offset);
    var zone = (offset < 0 ? "+" : "-") + ("00" + Math.floor(absO / 60)).slice(-2) + ":" + ("00" + (absO % 60)).slice(-2);
    return localISOTime + zone;
}
1
AmirHossein Manian

Utilisation de la méthode moment.js UTC ;

const moment = require('moment');
const utc = moment.utc(new Date(string));
1
Yaki Klein

En utilisant le package moment, vous pouvez facilement convertir une chaîne de date UTC en un nouvel objet Date:

const moment = require('moment');
let b = new Date(moment.utc('2014-02-20 00:00:00.000000'));
let utc = b.toUTCString();
b.getTime();

Cela est particulièrement utile lorsque votre serveur ne prend pas en charge le fuseau horaire et que vous souhaitez stocker la date UTC toujours sur le serveur et la récupérer en tant que nouvel objet Date. Le code ci-dessus a fonctionné pour mon besoin de problème similaire auquel ce fil est destiné. Partage ici pour qu'il puisse aider les autres. Je ne vois pas exactement la solution ci-dessus dans aucune réponse. Merci.

0
Bimal Jha

Je sais que cette question est ancienne, mais portait sur le même problème et une option serait d’envoyer date.valueOf () au serveur. La fonction valueOf () de la date javascript envoie le nombre de millisecondes écoulées depuis le 1er janvier 1970 à minuit UTC.

valeur de()

0
weagle08

Si vous avez besoin d'un objet Date

Chaîne de date transmise uniquement La date suppose que l'heure est 00:00 décalée par fuseau horaire:

new Date('2019-03-11')
Sun Mar 10 2019 18:00:00 GMT-0600 (Central Standard Time)

Si vous ajoutez les heures et les minutes actuelles, vous obtenez la date appropriée:

new Date('2019-03-11 ' + new Date().getHours() + ':' + new Date().getMinutes())
Mon Mar 11 2019 04:36:00 GMT-0600 (Central Standard Time)
0
keemor

C'est donc ce que je devais faire parce que je voulais toujours qu'un objet de date JavaScript soit manipulé comme une date et, malheureusement, beaucoup de ces réponses nécessitent de passer à une chaîne.

//First i had a string called stringDateVar that i needed to convert to Date
var newDate = new Date(stringDateVar)

//output: 2019-01-07T04:00:00.000Z
//I needed it 2019-01-07T00:00:00.000Z because i had other logic that was dependent on that 

var correctDate = new Date(newDate.setUTCHours(0))

//This will output 2019-01-07T00:00:00.000Z on everything which allows scalability 
0
kjohnsonthecoder