Lors de l'écriture d'une application Web, il est logique de stocker (côté serveur) toutes les heures de données dans la base de données en tant qu'horodatages UTC.
J'ai été étonné de constater que vous ne pouviez pas faire grand-chose en natif en termes de manipulation du fuseau horaire en JavaScript.
J'ai un peu étendu l'objet Date. Cette fonction a-t-elle un sens? En gros, chaque fois que j'envoie quelque chose au serveur, ça va être un horodatage formaté avec cette fonction ...
Pouvez-vous voir des problèmes majeurs ici? Ou peut-être une solution sous un angle différent?
Date.prototype.getUTCTime = function(){
return new Date(
this.getUTCFullYear(),
this.getUTCMonth(),
this.getUTCDate(),
this.getUTCHours(),
this.getUTCMinutes(),
this.getUTCSeconds()
).getTime();
}
Cela me semble un peu compliqué. Et je ne suis pas non plus si sûr des performances.
javascript
timezone
utc
Merc
la source
la source
new Date().toString()
vous montrera la représentation de l'heure du fuseau horaire actuel,new Date().toUTCString()
vous montrera l'heure UTC repr, maisnew Date().getTime()
est toujours UTC , car c'est ce que l'heure Unix est définie comme: "L'heure Unix (également appelée heure POSIX ou heure d'époque) est un système pour décrire les instants dans le temps, défini comme le nombre de secondes qui se sont écoulées depuis 00:00:00 temps universel coordonné (UTC), jeudi 1er janvier 1970, sans compter les secondes intercalaires. "Réponses:
Les dates construites de cette façon utilisent le fuseau horaire local, ce qui rend la date construite incorrecte. Pour définir le fuseau horaire d'un certain objet de date, il faut le construire à partir d'une chaîne de date qui inclut le fuseau horaire. (J'ai eu des problèmes pour faire fonctionner cela dans un ancien navigateur Android.)
Notez que
getTime()
renvoie des millisecondes, pas des secondes simples.Pour un horodatage UTC / Unix, ce qui suit devrait suffire:
Il prendra en compte le décalage du fuseau horaire actuel dans le résultat. Pour une représentation sous forme de chaîne, la réponse de David Ellis fonctionne.
Clarifier:
Cette entrée est traitée comme l'heure locale . Si l' heure UTC est passée, les résultats seront différents. Observez (je suis actuellement à GMT +02: 00, et il est 07:50):
Notez également que
getUTCDate()
cela ne peut pas être remplacégetUTCDay()
. C'est parce quegetUTCDate()
renvoie le jour du mois ; tandis que,getUTCDay()
renvoie le jour de la semaine .la source
new Date()
, cela crée une nouvelle date à partir de votre entrée UTC mais la traite comme une date / heure locale. 2) Oui, vous devez utiliserMath.floor(this.getTime() / 1000)
dans ce cas.Vous pouvez également le faire en utilisant getTimezoneOffset et getTime,
la source
var tt = new Date('Thu Jan 01 1970 08:00:00 GMT+0800 (China Standard Time)'); (tt.getTime() - tt.getTimezoneOffset()*60*1000)/1000
. Cela semblett.getTime() - tt.getTimezoneOffset()
correct pourGMT+0800
.var UTCseconds = (Math.floor(x.getTime()/1000) + x.getTimezoneOffset()*60)
new Date()
laquelle inclut un fuseau horaire .. ce qui va à l'Le moyen le plus simple d'obtenir l'heure UTC dans un format conventionnel est le suivant:
la source
Je pense en fait que les valeurs de date dans js sont bien meilleures que les objets C # DateTime. Les objets C # DateTime ont une propriété Kind, mais aucun fuseau horaire sous-jacent strict en tant que tel, et les conversions de fuseau horaire sont difficiles à suivre si vous effectuez une conversion entre deux heures non UTC et non locales. Dans js, toutes les valeurs Date ont une valeur UTC sous-jacente qui est transmise et connue indépendamment des conversions offest ou de fuseau horaire que vous effectuez. Ma plus grande plainte à propos de l'objet Date est la quantité de comportement non défini que les implémenteurs de navigateur ont choisi d'inclure, ce qui peut confondre les personnes qui attaquent les dates dans js avec des essais et des erreurs que la lecture des spécifications. L'utilisation de quelque chose comme iso8601.js résout ce comportement variable en définissant une seule implémentation de l'objet Date.
Par défaut, la spécification dit que vous pouvez créer des dates avec un format de date ISO 8601 étendu comme
Ainsi, vous pouvez déduire l'heure UTC exacte de cette façon.
Lorsque vous souhaitez renvoyer la valeur Date au serveur que vous appelleriez
ou si vous préférez travailler avec un horodatage en millisecondes (nombre de millisecondes à partir du 1er janvier 1970 UTC)
ISO 8601 est une norme. Vous ne pouvez pas être confus sur ce que signifie une chaîne de date si vous incluez le décalage de date. Ce que cela signifie pour vous en tant que développeur, c'est que vous n'avez jamais à gérer vous-même les conversions d'heure locale . Les valeurs d'heure locale existent uniquement pour le bénéfice de l'utilisateur, et les valeurs de date s'affichent par défaut dans leur heure locale. Toutes les manipulations de l'heure locale vous permettent d'afficher quelque chose de sensible pour l'utilisateur et de convertir des chaînes à partir de l'entrée utilisateur. C'est une bonne pratique de convertir en UTC dès que vous le pouvez, et l'objet js Date rend cela assez trivial.
En revanche, il n'y a pas beaucoup de possibilités de forcer le fuseau horaire ou les paramètres régionaux pour le client (dont je suis conscient), ce qui peut être ennuyeux pour les paramètres spécifiques au site Web, mais je suppose que le raisonnement derrière cela est qu'il s'agit d'un utilisateur configuration à ne pas toucher.
Donc, en bref, la raison pour laquelle il n'y a pas beaucoup de support natif pour la manipulation de fuseau horaire est que vous ne voulez tout simplement pas le faire.
la source
Vous n'avez généralement pas besoin de faire beaucoup de "manipulation du fuseau horaire" côté client. En règle générale, j'essaie de stocker et de travailler avec des dates UTC, sous la forme de
ticks
" nombre de millisecondes depuis minuit le 1er janvier 1970 ". Cela simplifie vraiment le stockage, le tri, le calcul des décalages, et surtout, vous évite le mal de tête des ajustements "Daylight Saving Time". Voici un petit code JavaScript que j'utilise.Pour obtenir l'heure UTC actuelle:
Ensuite, ce dont vous avez généralement besoin est de formater la date / l'heure pour l'utilisateur final en fonction de son fuseau horaire et de son format locaux . Ce qui suit prend en charge toutes les complexités des formats de date et d'heure sur l'ordinateur client:
Donc l'exemple suivant:
Renvoie ce qui suit (pour mes paramètres régionaux en anglais américain):
la source
getTimezoneOffset
valeur à votregetCurrentTimeUTC
fonction, vous renvoyez en fait un moment différent. Le résultat degetTime
est déjà en UTC.tmLoc.getTime()
est un décalage par rapport à l'heure locale. Il est facile de vérifier si vous avez accès à tout ce qui exécute JavaScript.getTime
, qui vous dirige vers la «valeur de temps» définie au §15.9.5 , qui est aPrimitiveValue
, telle que définie au §15.9.3.3 explicitement comme UTC.tmLoc
vianew Date()
, alors c'est la même chose. Le fuseau horaire affectera la sortie de la chaînetmLoc.toString()
et les éléments similaires, mais il n'affectera pastmLoc.getTime()
C'est toujours juste un nombre de millisecondes depuis minuit le 01/01/1970 en UTC.//The offset is in minutes -- convert it to ms
Je pense que c'est une meilleure solution
la source
Si vous voulez un seule ligne , l' horodatage UTC Unix peut être créé en JavaScript comme:
Cela prendra en compte le fuseau horaire du système. C'est essentiellement le temps écoulé en secondes depuis l'époque.
Comment ça fonctionne:
new Date()
.unary +
avant la création de l'objet pour le convertir entimestamp integer
. :+new Date()
.+new Date() / 1000
~~(+new Date())
la source
tilde
pastilda
(sic). Malheureusement, cela ne me permettra pas de supprimer une faute de frappe, je dois faire au moins 6 modifications de caractères. Smooth, Stackexchange, smoothJe veux préciser que new Date (). GetTime () renvoie en fait une valeur UTC, c'est donc un moyen vraiment utile de stocker et de gérer les dates d'une manière indépendante des heures localisées.
En d'autres termes, ne vous embêtez pas avec toutes les fonctions javascript UTC. Au lieu de cela, utilisez simplement Date.getTime ().
Plus d'informations sur l'explication est ici: Si javascript "(new Date ()). GetTime ()" est exécuté à partir de 2 fuseaux horaires différents.
la source
J'utilise ce qui suit:
Une fois définie cette méthode, vous pouvez faire:
la source
DateTime dt = new DateTime ("2018-07-15T02:36:00+02:00");
this.getTime()
renvoie un décalage UTC, la soustraction du décalage du fuseau horaire local le rend local, pas UTC, donc getUTCTime renvoie un décalage local, pas UTC.Je suis étonné de voir à quel point cette question est devenue complexe.
Ce sont tous identiques, et leurs valeurs entières toutes === EPOCH time: D
Ne me croyez pas, consultez: http://www.epochconverter.com/
la source
Depuis
new Date().toUTCString()
renvoie une chaîne comme"Wed, 11 Oct 2017 09:24:41 GMT"
vous pouvez découper les 3 derniers caractères et passer la chaîne découpée ànew Date()
:la source
EDIT: Le code ci-dessous ne fonctionne PAS. J'ai toujours supposé que la nouvelle Date (). GetTime () renvoyait le nombre de secondes depuis le 1er janvier 1970 DANS LE FUSEAU HORAIRE ACTUEL. Ce n'est pas le cas: getTime () renvoie le nombre de secondes en UTC. Ainsi, le code ci-dessous fait un surajustement brut. Merci tout le monde!]
Tout d'abord, merci pour vos idées fantastiques. Je suppose que ma question n'avait pas le bon titre ... elle aurait dû être "Obtenir l'horodatage UTC Unix pour une date existante".
Donc, si j'ai un objet date:
J'étais à la recherche d'une fonction qui me disait "L'horodatage UTC Unix".
Cette fonction semble être la vraie astuce:
Notez que cela fonctionne sur "ceci" Cela signifie que je peux faire:
Et obtenez le nombre de secondes depuis le 1er janvier 1970 à l'heure Unix. Droite?
C'est un peu fou, pour moi, que Javascript stocke tout à l'heure UTC, mais pour obtenir ce numéro, je dois créer un nouvel objet Date en passant les getters UTC individuels, puis enfin appeler getTime () pour cela ...
Merc.
la source
getUTCUnixTime
obtient le mauvais moment, et JavaScript ne fournir un moyen simple d'obtenir l'horodatage unix à partir d' unDate
objet - en utilisant lagetTime
méthode. Voir toutes les autres réponses.Je pense que c'est ce à quoi vous vous attendez ...
Maintenant,
la source
Une fois que vous faites cela
C'est déjà l'horodatage UTC
J'ai testé sur https://www.unixtimestamp.com/index.php
la source
Utilisation de day.js
Dans le navigateur:
Dans node.js:
Vous obtenez un horodatage UTC unix sans millisecondes.
la source
Cela renverra l'horodatage en UTC:
la source
new Date(new Date().toUTCString())
donne Wed Oct 04 2017 07:20:14 GMT + 0200 (GMT + 02: 00)