198 votes

Comment obtenir un horodatage UTC en JavaScript?

Lors de l'écriture d'une application web, il est logique de store (côté serveur) toutes les datetimes dans la DB que les horodatages UTC.

J'ai été étonné quand j'ai remarqué que vous ne pouviez pas nativement faire beaucoup en termes de Fuseau horaire manipulation en Javascript.

J'ai prolongé l'objet Date un peu. Cette fonction a un sens? Fondamentalement, chaque fois que j'ai envoyer quoi que ce soit pour le serveur, ça va être un timestamp formaté avec cette fonction...

Pouvez-vous voir des principaux problèmes ici? Ou peut-être une solution à partir d'un angle différent?

Date.prototype.getUTCTime = function(){ 
  return new Date(
    this.getUTCFullYear(),
    this.getUTCMonth(),
    this.getUTCDate(),
    this.getUTCHours(),
    this.getUTCMinutes(), 
    this.getUTCSeconds()
  ).getTime(); 
}

Il semble juste un peu alambiqué pour moi. Et je ne suis pas sûr au sujet de la performance des...

Merci!

Merc.

184voto

DCoder Points 8845

1) les Dates construit de cette manière que l'utilisation de votre fuseau horaire local, de sorte que votre construites date ne sera pas correct. Au meilleur de ma connaissance, la seule façon de régler le fuseau horaire d'une certaine date objet est de construire à partir d'une chaîne de date qui comprend le fuseau horaire. Pour une raison quelconque, j'ai eu des problèmes pour obtenir que de travailler dans un ancien navigateur Android.

2) .getTime() retours millisecondes, vous voulez probablement plaine secondes.

Si vous souhaitez un format UTC/timestamp unix, Math.floor((new Date()).getTime() / 1000) devrait suffire, il prendra en compte votre fuseau horaire dans le résultat. Si vous préférez une représentation de chaîne, puis David Ellis réponse va travailler.

Edit pour préciser certains plus de confusion: new Date(Y, M, D, h, m, s) traite son entrée en tant que l'heure locale. Si vous passez de temps UTC, bien sûr, vous obtiendrez des résultats différents. Observer (je suis en GMT +02:00 en ce moment, et il est 07:50):

> var d1 = new Date();
> d1.toUTCString();
"Sun, 18 Mar 2012 05:50:34 GMT" // two hours less than my local time, that makes sense
> Math.floor(d1.getTime()/ 1000)
1332049834 

> var d2 = new Date( d1.getUTCFullYear(), d1.getUTCMonth(), d1.getUTCDate(), d1.getUTCHours(), d1.getUTCMinutes(), d1.getUTCSeconds() );
> d2.toUTCString();
"Sun, 18 Mar 2012 03:50:34 GMT" // four hours less than my local time, and two hours less than the original time - because my GMT+2 input was interpreted as GMT+0!
> Math.floor(d2.getTime()/ 1000)
1332042634

Edit: celui qui a proposé une modification évolution getUTCDate() de getUTCDay(), vous avez tort. getUTCDate() retourne le jour du mois, getUTCDay() renvoie le jour de la semaine.

Celui qui a approuvé cette modification dans les moments de lui montrer, honte sur vous.

66voto

shiplu.mokadd.im Points 28895

Vous pouvez également le faire en utilisant getTimezoneOffset et getTime,

 x = new Date()
var UTCseconds = (x.getTime() + x.getTimezoneOffset()*60*1000)/1000;
 

42voto

David Ellis Points 4278

Ouais, vous n'avez pas besoin de faire grand-chose; même si je vous comprends bien, vous voulez juste l' toUTCString méthode.

var UTCstring = (new Date()).toUTCString();

Cependant, rappelez-vous que les valeurs de la date que vous obtenez sont basées sur l'horloge de la machine du client, pas de votre serveur. Si vous avez besoin d'obtenir des valeurs précises pour ces dates (par exemple, pour commander correctement lorsque telle ou telle action a été fait par rapport à une autre action de l'utilisateur), vous ne pouvez pas compter sur le côté client de la date de la bibliothèque, de toute façon, et vous avez besoin pour calculer les dates côté serveur basée sur le moment où le client vous a contacté.

Rappelez-vous que bien que, fondamentalement, l'ensemble de votre code côté client peuvent être modifiés par le client et malveillants valeurs renvoyées au lieu de cela, vous ne pouvez garantir le code sur le serveur-côté-traiter le côté client, comme un éventuel attaquant.

17voto

Matt Esch Points 7513

Je pense en fait que les valeurs de Date en js sont bien mieux que de dire le C# DateTime objets. Le C# DateTime objets ont une Sorte de propriété, mais pas strictement de temps sous-jacente de la zone en tant que tel, et l'heure de la zone de conversions sont difficiles à suivre si vous êtes à la conversion entre les deux non UTC et non l'heure locale. En js, toutes les valeurs de Date sous-jacent UTC valeur qui est passée autour et sans considération de la offest de temps ou de zone de conversions que vous faites. Ma plus grande plainte au sujet de l'objet Date est le montant de comportement indéfini que le navigateur les réalisateurs ont choisi d'inclure, ce qui peut confondre les gens qui attaquent les dates en js avec essais et erreurs que la lecture de la spec. En utilisant quelque chose comme iso8601.js résout cette variable comportement en définissant un unique de mise en œuvre de l'objet Date.

Par défaut, la spec dit vous pouvez créer des dates avec un format de date ISO 8601 comme

var someDate = new Date('2010-12-12T12:00Z');

Donc, vous pouvez déduire le exacte heure UTC de cette façon.

Lorsque vous souhaitez passer la valeur de Date de retour pour le serveur que vous appelez

someDate.toISOString();

ou si vous préférez travailler avec une milliseconde d'horodatage (nombre de millisecondes depuis le 1er janvier 1970 UTC)

someDate.getTime();

ISO 8601 est une norme. Vous ne pouvez pas être confus au sujet de ce qu'est une chaîne de date signifie que si vous incluez la date de l'offset. Ce que cela signifie pour vous en tant que développeur, c'est que vous ne jamais avoir à traiter avec, heure locale, les conversions de vous-même. L'heure locale, il existe des valeurs purement pour le bénéfice de l'utilisateur, la date et les valeurs par défaut de l'affichage de l'heure locale. Tout à l'heure locale de manipulations permettent d'afficher quelque chose de sensible, de l'utilisateur et de convertir des chaînes de caractères à partir de la saisie de l'utilisateur. C'est une bonne pratique pour convertir au format UTC dès que vous le pouvez, et la js objet Date qui rend ce assez trivial.

Sur le revers de la médaille il n'y a pas beaucoup de champ pour forcer le fuseau horaire et les paramètres régionaux du client (que je sache), ce qui peut être gênant pour le site web de paramètres spécifiques, mais je suppose que le raisonnement derrière cela est que c'est une configuration de l'utilisateur qui ne devrait pas être touché.

Donc, en bref, la raison pour laquelle il n'y a pas beaucoup de support natif pour le temps de la zone de manipulation est parce que vous ne voulez simplement pas à le faire.

11voto

ahmd0 Points 3495

Vous n'avez généralement pas besoin de faire beaucoup de "Fuseau horaire de manipulation" sur le côté client. En règle générale j'essaie de stocker et de travailler avec des dates UTC, sous la forme d' ticks ou "nombre de millisecondes écoulées depuis minuit, le 1er janvier 1970." - Ce vraiment simplifie le stockage, le tri, le calcul des compensations, et la plupart de tous, vous débarrasse des maux de tête de la "Heure d'été" des ajustements. Voici un petit code JavaScript que j'utilise.

Pour obtenir de l'heure UTC actuelle:

function getCurrentTimeUTC()
{
    //RETURN:
    //      = number of milliseconds between current UTC time and midnight of January 1, 1970
    var tmLoc = new Date();
    //The offset is in minutes -- convert it to ms
    return tmLoc.getTime() + tmLoc.getTimezoneOffset() * 60000;
}

Ensuite ce que vous souhaitez, c'est pour le format de date/heure pour l'utilisateur, pour leur locale, fuseau horaire et le format. La suite prend soin de toutes les complexités de formats de date et heure sur l'ordinateur client:

function formatDateTimeFromTicks(nTicks)
{
    //'nTicks' = number of milliseconds since midnight of January 1, 1970
    //RETURN:
    //      = Formatted date/time
    return new Date(nTicks).toLocaleString();
}

function formatDateFromTicks(nTicks)
{
    //'nTicks' = number of milliseconds since midnight of January 1, 1970
    //RETURN:
    //      = Formatted date
    return new Date(nTicks).toLocaleDateString();
}

function formatTimeFromTicks(nTicks)
{
    //'nTicks' = number of milliseconds since midnight of January 1, 1970
    //RETURN:
    //      = Formatted time
    return new Date(nTicks).toLocaleTimeString();
}

Ainsi l'exemple suivant:

var ticks = getCurrentTimeUTC();  //Or get it from the server

var __s = "ticks=" + ticks + 
    ", DateTime=" + formatDateTimeFromTicks(ticks) +
    ", Date=" + formatDateFromTicks(ticks) +
    ", Time=" + formatTimeFromTicks(ticks);

document.write("<span>" + __s + "</span>");

Renvoie les éléments suivants (pour ma AMÉRICAIN de paramètres régionaux anglais):

les tiques=1409103400661, DateTime=8/26/2014 6:36:40 PM, Date=8/26/2014, Temps=6:36:40 PM

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