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 quelconque, mais le serveur s'attend à ce que toutes les dates et heures soient en UTC.
suppose maintenant que l'utilisateur est en Alaska ou Hawaii ou Fidji. Comme ils sont dans un fuseau horaire très différent de UTC, la plage de dates doit être convertie en quelque chose comme ceci:
2009-1-1T8:00:00 to 2009-1-4T7:59:59
utilisant L'objet Date JavaScript, comment convertir la première plage de dates" localisées " en quelque chose que le serveur comprendra?
24 réponses
la méthode
toISOString()
renvoie une chaîne EN ISO étendu simplifié format ( ISO 8601 ), qui est toujours de 24 ou 27 caractères (YYYY-MM-DDTHH:mm:ss.sssZ
ou±YYYYYY-MM-DDTHH:mm:ss.sssZ
)" , respectivement.) Le fuseau horaire est toujours zéro UTC offset, comme indiqué par le suffixe "Z
".
Source: MDN web docs
le format dont vous avez besoin est créé avec le .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 capacité de faire ce que vous avez besoin:
var isoDate = new Date('yourdatehere').toISOString();
pour le travail de fuseau horaire, moment.JS et moment.js fuseau horaire sont vraiment des outils précieux...spécialement pour la navigation des fuseaux horaires entre le javascript client et le javascript serveur.
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);
voici ma méthode:
var now = new Date();
var utc = new Date(now.getTime() + now.getTimezoneOffset() * 60000);
l'objet utc
qui en résulte 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, il fait le travail.
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(':');
}
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(date / heure sera changée)
isoDate = new Date(now).toISOString();
//OUTPUT : 2015-02-20T13:59:31.238Z
navigateurs peuvent différer, et vous devriez également se rappeler de ne pas faire confiance à toute information générée par le client, cela étant dit, la déclaration 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 que de simplement 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 selon les paramètres du système.
- Note: Lorsque la Date est appelée en tant que constructeur avec plus d'un argument, les arguments spécifiés représentent l'heure locale. Si UTC est désiré, utilisez une nouvelle Date( Date.UTC(...) ) avec les mêmes arguments. (note: Date d'.UTC() retourne le nombre de millisecondes depuis 1970-01-01 00:00:00 UTC)
ajout de la Date 60000*.getTimezoneOffset () comme les réponses précédentes l'ont indiqué est incorrect. Tout d'abord, vous devez penser à toutes les Dates/heures comme étant déjà UTC avec un modificateur de fuseau horaire pour les besoins de l'affichage.
encore une fois, les navigateurs peuvent différer, cependant, la 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. Toutefois, si vous l'affichez en l'appelant .toString () il semblera être dans votre fuseau horaire local parce que .toString () utilise votre fuseau horaire local, pas le fuseau horaire de l'objet Date sur lequel il est appelé.
j'ai aussi trouvé que si vous appelez .getTimezoneOffset () à une date, il retournera votre fuseau horaire local, pas le fuseau horaire de l'objet date sur lequel vous l'avez appelé (Je ne peux pas le vérifier pour être standard cependant).
dans mon navigateur, ajoutant 60000 * Date.getTimezoneOffset() crée une DateTime qui est Non UTC . Toutefois, lorsqu'il est affiché dans mon navigateur (ex:.toString ()), il affiche un DateTime dans mon fuseau horaire local qui serait l'heure UTC correcte si les informations du fuseau horaire sont ignorées.
var myDate = new Date(); // Set this to your date in whichever timezone.
var utcDate = myDate.toUTCString();
essayez-vous de convertir la date en chaîne de caractères?
je ferais une fonction pour faire ça, et, bien que ce soit légèrement controversé, l'ajouter au prototype Date. Si vous n'êtes pas à l'aise de faire cela, alors vous pouvez le mettre 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 temps UTC, remplacez toutes les fonctions get* par getUTC*, par exemple: getUTCFullYear, getUTCMonth, getUTCHours... et puis il suffit d'ajouter "+00:00" à la fin au lieu de l'utilisateur du décalage horaire.
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
ma recommandation lorsque je travaille avec des dates est d'analyser la date dans des champs individuels à partir de l'entrée de l'utilisateur. Vous pouvez l'utiliser comme une corde pleine, 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 Jamais faire quelque chose comme:
new Date('date as text');
une fois que vous avez votre date analysée dans ses champs individuels à partir de l'entrée de l'utilisateur, créez un objet date. Une fois que l'objet date est créé, convertissez-le en UTC en ajoutant le décalage du fuseau horaire. Je ne peux pas insister sur l'importance d'utiliser le décalage de l'objet date dû à DST (c'est 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);
maintenant vous pouvez passer la date au serveur dans L'heure UTC. Encore une fois, je recommande fortement contre l'utilisation de chaînes de date. Soit vous le passez au serveur avec la granularité la plus basse dont vous avez besoin, par exemple Année, Mois, Jour, minute ou comme une valeur en millisecondes de l'époque unix.
si vous avez beaucoup à faire avec les dates, cela vaut la peine d'utiliser 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 à n'importe quel format que vous voulez:
moment(yourTime).utc().format("YYYY-MM-DD")
il y a aussi des options offset dans moment mais il y a une bibliothèque complémentaire supplémentaire pour traiter le fuseau horaire ( http://momentjs.com/timezone / ). Temps la conversion serait aussi simple que ceci:
moment.tz(yourUTCTime, "America/New_York")
une autre solution pour convertir en UTC et le conserver comme objet de date: (Cela fonctionne en enlevant la partie 'GMT' de la fin de la chaîne formatée, puis en la remettant dans le constructeur de Date)
var now = new Date();
var now_utc = new Date(now.toUTCString().slice(0, -4));
j'avais besoin de faire cela pour me connecter avec une bibliothèque de picker datetime. Mais en général, c'est une mauvaise idée de travailler avec des dates de cette façon.
les utilisateurs veulent généralement travailler avec des datetimes dans leur heure locale, donc soit vous mettez à jour le code côté serveur pour analyser correctement les chaînes datetime avec les offsets, puis vous convertissez en UTC (meilleure option) ou vous convertissez en UTC string côté client avant d'envoyer au serveur (comme dans la réponse de Will Stern)
je viens de découvrir que la version 1.2.3 de la date de Steven Levithan.format.js fait exactement ce que je veux. Il vous permet de fournir une chaîne de format pour une date JavaScript et convertira de l'heure locale à 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');
j'ai trouvé le jQuery Mondialisation Plugin date d'analyse pour mieux fonctionner. D'autres méthodes ont eu des problèmes entre les navigateurs et des trucs comme la date.js n'avait pas été mis à jour depuis longtemps.
vous n'avez pas non plus besoin d'un curseur sur la page. Vous pouvez simplement appeler quelque chose de similaire à l'exemple donné dans les docs:
$.parseDate('yy-mm-dd', '2007-01-26');
cette fonction fonctionne très bien 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();
}
utilisant moment.js UTC method ;
const moment = require('moment');
const utc = moment.utc(new Date(string));
en regardant votre question il est clair que vous voulez juste envoyer la gamme de date à votre arrière-plan pour un post-traitement ultérieur.
je suppose que vous vous conformez aux directives de données standard qui s'attendent à ce que les données soient dans un format particulier. Par exemple, J'utilise ODATA qui est une API RESTfull qui s'attend à ce que les objets date time soient au format: -
AAAA-MM-JJT00:00:00.
qui peut être facilement atteint via le snippet affiché ci-dessous(s'il vous plaît changer le format selon votre exigence).
var mydate;//assuming this is my date object which I want to expose
var UTCDateStr = mydate.getUTCFullYear() + "-" + mydate.getUTCMonth() + "-" + mydate.getUTCDate() + "T00:00:00";
si d'un autre côté, vous êtes dans ma situation où vous avez reçu une date de votre backend, et le navigateur convertit cela à votre date locale. Vous d'autre part êtes intéressé par la date UTC alors vous pouvez effectuer ce qui suit: -
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 fondamentalement, ajoute/soustrait le temps ajoute/soustrait par le navigateur basé sur le fuseau horaire.
par exemple, si je suis en EST (GMT-5) et que mon Service retourne un objet date heure = mer août 17 2016 00:00: 00 GMT-0500 mon navigateur automatiquement soustrait le décalage horaire(5hrs) pour obtenir mon heure locale. Donc, si j'essaie de récupérer l'heure que je reçois mer août 16 2016 19:00:00 GMT-0500. Cela provoque beaucoup de problèmes. Il y a beaucoup de bibliothèques qui va certainement rendre cela plus facile, mais je voulait partager l'approche pure JS.
Pour plus d'informations s'il vous plaît jeter un oeil à: http://praveenlobo.com/blog/how-to-convert-javascript-local-date-to-utc-and-utc-to-local-date/ où j'ai obtenu mon inspiration.
Espérons que cette aide!
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 le getTimezoneOffset()
vous donnera la différence de fuseau horaire en quelques minutes.
Je vous recommande de ne pas utiliser toISOString()
parce que la sortie sera dans la chaîne de caractères donc à l'avenir vous ne pourrez pas manipuler la date
C'est ce que j'ai fait dans le passé:
var utcDateString = new Date(new Date().toUTCString()).toISOString();
cette méthode vous donnera: 2017-08-04T11:15:00.000+04:30
et vous pouvez ignorer zone variable pour simplement obtenir 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;
}
je sais que cette question Est ancienne, mais je me penchais sur la même question, et une option serait d'envoyer la date.valueOf () au serveur à la place. la fonction valueOf() de la Date javascript envoie le nombre de millisecondes depuis minuit le 1er janvier 1970 UTC.
si vous avez besoin de Date objet
en Passant uniquement date string Date suppose l'heure à 00:00 décalé par time zone:
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 correcte:
new Date('2019-03-11 ' + new Date().getHours() + ':' + new Date().getMinutes())
Mon Mar 11 2019 04:36:00 GMT-0600 (Central Standard Time)
le constructeur renvoie l'entier en ms depuis l'époque unix. Tous ceux-ci représentent L'UTC:
(nœud.js v8.0)
var now = new Date();
console.log(now.getTime());
console.log((now - now.getTimezoneOffset()));
var utcDate = new Date(new Date().getTime());
console.log(utcDate.getTime());
imprime:
1496675469925
1496675470045
1496675469950
encore plus simple
myvar.setTime(myvar.getTime() + myvar.getTimezoneOffset() * 60000);