Question

Supposons qu'un utilisateur de votre site 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 toutes les dates et heures pour être en UTC.

Supposons maintenant que l'utilisateur est en Alaska ou à Hawaï ou Fidji. Puisqu'ils sont dans un fuseau horaire différent de tout UTC, la plage de dates doit être converti en quelque chose comme ceci:

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

Utilisation de l'objet Date JavaScript, comment voulez-vous convertir la première plage de dates « localisée » dans quelque chose que le serveur comprendra?

Était-ce utile?

La solution

  

La méthode toISOString() retourne une chaîne dans la norme ISO étendue simplifiée   Format ( ISO 8601 ), qui est 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 zéro décalage UTC, comme indiqué par   le suffixe « Z ».

Source: docs web MDN

Le format dont vous avez besoin est créé avec la méthode .toISOString(). Pour les anciens navigateurs (IE8 et moins), qui ne supportent pas nativement cette méthode, la cale se trouve :

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

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

Pour le travail de décalage horaire, moment.js et moment.js fuseau horaire sont vraiment des outils précieux ... surtout pour naviguer timezones entre le client et le javascript serveur.

Autres conseils

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 résultant 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 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 modifiée)

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

lien Fiddle

Les navigateurs peuvent être différents, et vous devriez aussi 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 juste new Date()?" voir ici: https://developer.mozilla.org/ en-US / docs / Web / JavaScript / Référence / Global_Objects / date

  • Si aucun argument sont fournis, le constructeur crée pour la date et l'heure d'un objet Date JavaScript en fonction des paramètres du système.
  • Note: Si la date est appelée en tant que constructeur avec plus d'un argument, les arguments représentent l'heure locale spécifiées. Si l'on souhaite UTC, utilisez new Date ( date. UTC (...) ) avec les mêmes arguments. (Note: Date.UTC () retourne le nombre de millisecondes depuis 1970-01-01 00:00:00 UTC)

Ajout du * Date.getTimezoneOffset 60000 () que les réponses précédentes ont déclaré est incorrect. Tout d'abord, vous devez penser à toutes les dates / Times comme étant déjà UTC avec un modificateur de fuseau horaire pour l'affichage.

Encore une fois, les navigateurs peuvent différer, cependant, Date.getTime () retourne le nombre de millisecondes depuis 1970-01-01 UTC / GMT. Si vous créez une nouvelle date en utilisant ce nombre comme je le fais ci-dessus, il sera UTC / GMT. Cependant, si vous affichez en appelant .toString () il semble être dans votre fuseau horaire local parce que .toString () utilise votre fuseau horaire local, et non pas le fuseau horaire de l'objet Date il est appelé.

Je l'ai aussi trouvé que si vous appelez .getTimezoneOffset () à une date, il retournera votre fuseau horaire local, et non le fuseau horaire de l'objet de la date que vous avez appelé sur (je ne peux pas vérifier ce être standard cependant).

Dans mon navigateur, en ajoutant * Date.getTimezoneOffset 60000 () crée un DateTime qui est pas UTC . Cependant lors de l'affichage dans mon navigateur (ex: .toString ())., Il affiche un DateTime dans mon fuseau horaire local qui serait correct si l'heure UTC info fuseau horaire est ignoré

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

Vous essayez de convertir la date dans une chaîne comme ça?

Je ferais fonction de le faire, et, si elle est un peu controversé, l'ajouter au prototype de la date. Si vous n'êtes pas à l'aise avec cela, vous pouvez le mettre en 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 avez besoin dans le temps UTC, il suffit de remplacer toutes les fonctions get de * avec getUTC *, par exemple: getUTCFullYear, getUTCMonth, getUTCHours ... et puis il suffit d'ajouter « +00: 00 » à la fin au lieu du fuseau horaire de l'utilisateur décalage.

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

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

Ma recommandation lorsque l'on travaille avec des dates est d'analyser la date dans les champs individuels de l'entrée utilisateur. Vous pouvez l'utiliser comme une chaîne complète, mais vous jouez avec le feu.

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

https: //developer.mozilla. org / fr-fr / docs / Web / JavaScript / Référence / Global_Objects / date / parse

Ne jamais faire quelque chose comme:

new Date('date as text');

Une fois que vous avez votre date dans ses champs analysé individuels de l'entrée d'utilisateur, créer un objet date. Une fois que l'objet de la date est créé le convertir en UTC en ajoutant décalage du fuseau horaire. Je ne peux pas souligner à quel point il est important d'utiliser le décalage par rapport à l'objet de la date en raison de l'heure d'été (ce qui est une autre discussion cependant 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 le temps UTC. Encore une fois, je vous recommande fortement de ne pas utiliser toutes les chaînes de date. Soit transmettre au serveur en panne à la granularité le plus bas que vous devez par exemple année, mois, jour, minute ou une valeur comme millisecondes de l'époque unix.

Si vous faites affaire avec des dates beaucoup, il est intéressant d'utiliser moment.js ( http://momentjs.com ) . La méthode pour convertir UTC serait:

moment(yourTime).utc()

Vous pouvez utiliser le format pour changer la date au format que vous voulez:

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

Il y a des options de décalage aussi bien en ce moment mais il y a une bibliothèque complémentaire supplémentaire pour faire face à fuseau horaire ( http: // momentjs .com / fuseau horaire / ). La conversion de temps serait aussi simple que cela:

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

Une autre solution pour convertir en UTC et le garder comme objet date: (Il fonctionne en supprimant la partie « GMT » de la fin de la chaîne formatée, puis le remettre dans le constructeur de date)

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

Je avais besoin de faire l'interface avec une bibliothèque de sélecteur de datetime. Mais en général, il est une mauvaise idée de travailler avec des dates de cette façon.

Les utilisateurs veulent généralement travailler avec datetimes dans leur heure locale, afin que vous soit mettre à jour le code côté serveur pour analyser des chaînes de datetime avec des décalages correctement, puis convertir en UTC (meilleure option) ou vous convertir à une chaîne UTC côté client avant envoyer au serveur (comme dans la réponse de Will Stern)

Je viens de découvrir que la version 1.2.3 de Steven Levithan de date.format.js fait exactement ce que je veux. Il vous permet de fournir une chaîne de format pour une date JavaScript et vous convertir l'heure locale en UTC. Voici le code que je 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'); 

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

Utilisation moment.js méthode UTC ;

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

est ce que je l'ai fait dans le passé:

var utcDateString = new Date(new Date().toUTCString()).toISOString();

En regardant votre question son clair que vous voulez juste envoyer la plage de dates à votre back-end pour un traitement ultérieur de poste.

Je suppose que vous conformément aux indications de données standard qui attendent que les données soient dans un format particulier. Par exemple, j'utilise ODATA qui est une API REST qui attend des objets de date et heure pour être au format suivant: -

  

AAAA-MM-DDT00: 00:. 00

Cela peut être facilement atteint par l'extrait ci-dessous posté (S'il vous plaît changer 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";

Si d'autre part, vous êtes dans ma situation dans laquelle vous avez reçu une date de votre back-end, et le navigateur convertit que votre date locale. Vous d'autre part sont intéressés à la date UTC vous pouvez effectuer les opérations suivantes: -

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 / retranche le temps supplémentaire / soustraites par le navigateur basé sur le fuseau horaire.

Par exemple, si je suis EST (GMT-5) et mon service retourne un objet date heure = Mer 17 août 2016 00:00:00 GMT-0500 mon navigateur automatiquement le fuseau horaire retranche décalage (5 heures) pour obtenir mon heure locale. Donc, si j'essaie de chercher le temps que je reçois mer 16 août 2016 19:00:00 GMT-0500. Cela provoque beaucoup de problèmes. Il y a beaucoup de bibliothèques là-bas qui va certainement vous faciliter la tâche, mais je voulais partager l'approche purement 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ù dans je me suis inspiré.

Hope this helps!

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 bonne date et l'heure UTC.
Il 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 où l'avenir vous ne serez pas en mesure de manipuler la date

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

Si vous avez besoin Date de l'objet

Passing seule chaîne date date prend le temps d'être décalé de 00h00 le fuseau horaire:

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

Si vous ajoutez heures en cours et minutes, vous avez 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)

Utilisation de package moment, vous pouvez facilement convertir une chaîne de date UTC à 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();

Cette aide spécialement lorsque votre serveur ne supporte pas fuseau horaire et que vous souhaitez stocker la date UTC toujours dans le serveur et récupérer comme un nouvel objet Date. Au-dessus du code travaillé pour mon exigence de problème similaire que ce fil est pour. Le partage ici afin de pouvoir aider les autres. Je ne vois pas exactement au-dessus solution dans une réponse. Merci.

Je sais que cette question est vieux, mais regardais à ce même problème, et une option serait d'envoyer date.valueOf () au serveur à la place. la fonction valueOf () du javascript date envoie le nombre de millisecondes depuis minuit le 1er Janvier, 1970 UTC.

valueOf ()

Alors c'est la façon dont je devais le faire parce que je voulais encore un objet de date JavaScript pour manipuler comme une date et unfortunantly beaucoup de ces réponses vous obligent à aller à 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 


encore plus simple

myvar.setTime(myvar.getTime() + myvar.getTimezoneOffset() * 60000);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top