Heure locale Convertir au format UTC dans la ruche
J'ai beaucoup cherché sur Internet mais impossible de trouver la réponse. Voici ma question:
Je suis en train d'écrire des requêtes dans la Ruche. J'ai un horodatage UTC et souhaitez le modifier à l'heure UTC, par exemple, étant donné timestamp 1349049600, je voudrais le convertir en heure UTC qui est 2012-10-01 00:00:00. Cependant, si j'utilise la fonction intégrée from_unixtime(1349049600)
dans la Ruche, j'ai le local PDT temps 2012-09-30 17:00:00.
J'ai réalisé il y a un construit en fonction appelée from_utc_timestamp(timestamp, string timezone)
. Ensuite, j'ai essayé comme from_utc_timestamp(1349049600, "GMT")
la sortie est 1970-01-16 06:44:09.6 qui est totalement erronée.
Je ne veux pas changer de fuseau horaire de la Ruche en permanence parce qu'il y a d'autres utilisateurs. Donc, il y a moyen d'obtenir un horodatage UTC chaîne de 1349049600 "2012-10-01 00:00:00"? Merci beaucoup!!
source d'informationauteur Iam619
Vous devez vous connecter pour publier un commentaire.
Aussi loin que je peux dire,
from_utc_timestamp()
besoins d'une chaîne de date argument, comme"2014-01-15 11:21:15"
pas un unix de secondes depuis l'epoch valeur. Qui pourrait être pourquoi il donne des résultats bizarres lorsque vous passez un entier?La seule Ruche fonction qui traite avec de l'époque secondes semble être
from_unixtime()
qui vous donne un timestamp chaîne dans le serveur fuseau horaireque j'ai trouvé dans/etc/sysconfig/clock
-"America/Montreal"
dans mon cas.De sorte que vous pouvez obtenir un horodatage UTC chaîne via
to_utc_timestamp(from_unixtime(1389802875),'America/Montreal')
et ensuite de les convertir à votre cible fuseau horaire avecfrom_utc_timestamp()
Il semble très tortueux, plus particulièrement de fil de votre serveur TZ dans votre SQL. La vie serait plus facile si il y avait un
from_unixtime_utc()
fonction ou quelque chose.Mise à jour:
from_utc_timestamp()
ne se traiter avec un millisecondes argument ainsi que d'une chaîne, mais obtient alors la conversion de mal.Quand j'essaie
from_utc_timestamp(1389802875000, 'America/Los_Angeles')
il donne"2014-01-15 03:21:15"
qui est faux.La bonne réponse est
"2014-01-15 08:21:15"
que vous pouvez obtenir (pour un serveur de Montréal) viafrom_utc_timestamp(to_utc_timestamp(from_unixtime(1389802875),'America/Montreal'), 'America/Los_Angeles')
Hey voulais juste ajouter un peu d'ici, je te suggère de chercher à "automatiser" le système de fuseau horaire. Ainsi, au lieu de statiquement
Donner un coup de cette
Ce n'utilise la chaîne de format de sortie de "
from_unixtime
" pour afficher le fuseau horaire de chaîne de caractères (minuscules z)L'utiliser comme ceci :
to_utc_timestamp(from_unixtime(timestamp),"PDT")
Cet exemple fournit une solution pour le problème d'avoir un fil de la valeur de l'heure système de la zone TZ dans votre ruche code. Il a été exécuté à l'aide de la ruche 0.10.0 dans un environnement Centos, avec OpenJDK java version 1.6. Parce qu'elle implique des temps de manipulation de ces précise logiciel révisions pourraient question. Actuellement, le système d'exploitation dans l'EDT. Le tableau tblFiniteZahl est comme un DOUBLE, mais avec environ un million de lignes, de, vous l'aurez deviné, finis les numéros. Mais vous pouvez le remplacer par n'importe quelle table avec au moins 1 ligne. L'astuce est de format de l'heure dans un fuseau horaire local, mais utiliser le z format pour capturer le fuseau horaire, puis d'extraire de la valeur au moment de l'exécution pour passer à la to_utc_timestamp fonction.
Le résultat est
Ce qui montre que la to_utc_timestamp prend un deuxième argument de l'EDT.
Je suis allé à currentmillis.com et collé 1349049600 sans s'en rendre compte, il était réellement secondes. Et en effet, il est retourné 1970-01-16 dans la date, ce qui signifie que la fonction que vous avez suggéré: from_utc_timestamp en fait ne prend que quelques millisecondes que le premier paramètre? Peut-être que vous pouvez essayer à nouveau avec
from_utc_timestamp(1349049600000, "GMT")
?