2013-08-16 36 views
10

Szukałem dużo w Internecie, ale nie mogłem znaleźć odpowiedzi. Oto moje pytanie:Konwersja czasu lokalnego do UTC Czas w ulu

Piszę kilka pytań w Hive. Mam znacznik czasu UTC i chciałbym go zmienić na czas UTC, np. Z podanym znacznikiem czasowym 1349049600, chciałbym przekonwertować go na czas UTC, czyli od 2012-10-01 00:00:00. Jednak jeśli używam wbudowanej funkcji from_unixtime(1349049600) w Hive, otrzymuję lokalny czas PDT 2012-09-30 17:00:00.

Zrozumiałem, że istnieje wbudowana funkcja o nazwie from_utc_timestamp(timestamp, string timezone). Potem próbowałem go jak from_utc_timestamp(1349049600, "GMT"), wyjście to 1970-01-16 06: 44: 09.6 co jest całkowicie niepoprawne.

Nie chcę na stałe zmieniać strefy czasowej Hive, ponieważ są inni użytkownicy. Czy jest jakiś sposób, aby uzyskać ciąg znaków UTC od 1349049600 do "2012-10-01 00:00:00"? Wielkie dzięki!!

Odpowiedz

-1

Poszedłem do currentmillis.com i wkleiłem 1349049600, nie zdając sobie sprawy, że to w rzeczywistości sekundy. I rzeczywiście powrócił 1970-01-16 w dniu, co oznacza, że ​​funkcja, którą zasugerowałeś: from_utc_timestamp faktycznie zajmuje milisekundy jako pierwszy parametr? Może możesz spróbować ponownie za pomocą from_utc_timestamp(1349049600000, "GMT")?

+0

Próbowałem że zbyt ale czas nadal jest nie w porządku ... Widziałem nawet post informujący, że powinniśmy pomnożyć 1349049600000 z 1.0 ('1349049600000 * 1.0'), ale nie działa, albo ... dziękuje za twoją pomoc! – Iam619

+0

Czy możesz zamiast tego spróbować użyć to_utc_timestamp? Uważam, że ma tę samą składnię. – Sandman

12

Z tego co wiem, from_utc_timestamp() potrzebuje argumentu z datą, jak "2014-01-15 11:21:15", a nie jako wartość sekunda-od-epoki unix. Być może dlatego daje nieparzyste wyniki, gdy przekazujesz liczbę całkowitą?

Jedynym Hive funkcja, która zajmuje się epoki sekund wydaje się być from_unixtime() które daje ciąg datownika w strefie czasowej serwera , który znalazłem w /etc/sysconfig/clock - "America/Montreal" w moim przypadku.

Więc można dostać timestamp ciąg UTC poprzez to_utc_timestamp(from_unixtime(1389802875),'America/Montreal'), a następnie przekonwertować do docelowej strefy czasowej z from_utc_timestamp()

to wszystko wydaje się bardzo okrutne, zwłaszcza konieczności okablowania swoją TZ do swojego serwera SQL. Życie byłoby łatwiejsze, gdyby istniała funkcja from_unixtime_utc() lub coś podobnego.


Aktualizacja: from_utc_timestamp() ma do czynienia z Milli sekund argumentu, a także ciąg, ale potem dostaje konwersja źle.

Kiedy próbuję from_utc_timestamp(1389802875000, 'America/Los_Angeles'), daje ona "2014-01-15 03:21:15", która jest nieprawidłowa.
Prawidłowa odpowiedź to "2014-01-15 08:21:15" które można dostać (na serwerze w Montrealu) poprzez from_utc_timestamp(to_utc_timestamp(from_unixtime(1389802875),'America/Montreal'), 'America/Los_Angeles')

+1

Jestem na Hive 0.10. Wygląda to jak ten błąd: https://issues.apache.org/jira/browse/HIVE-2867 – patricksurry

2

Używaj go tak:

to_utc_timestamp(from_unixtime(timestamp),"PDT")

+2

To się udało, ale wygląda na to, że powinno być 'from_utc_timestamp (from_unixtime (timestamp)," PDT ")' –

+0

@ChrisA. Użytkownik chce przekonwertować czas na strefę czasową TO utc, dlatego ta funkcja. –

+2

Twój kod ma pewne problemy. (1) Nieczytelna literówka (np. '..._ timezone' ->' ..._ timestamp') i (2) strefa czasowa '' PDT ''nie działa. Ten kod 'to_utc_timestamp (from_unixtime (timestamp)," PST ")' działa dla mnie. – swdev

1

Przykład ten stanowi rozwiązanie problemu mający przewodowych wartość systemowej strefy czasowej TZ w twoim kodzie ula. Został uruchomiony przy użyciu gałęzi 0.10.0 w środowisku Centos, z wersją 1.6 Javy OpenJDK. Ponieważ wiąże się to z manipulacją czasem, dokładne wersje oprogramowania mogą mieć znaczenie. Obecnie system działa w systemie EDT. Stół tblFiniteZahl jest jak DWA, ale z około milionem rzędów, jak można się domyślić, skończonymi liczbami. Ale możesz zastąpić dowolną tabelę co najmniej jednym rzędem.Sztuką jest sformatowanie czasu w lokalnej strefie czasowej, ale użycie formatu z do przechwytywania strefy czasowej, a następnie wyodrębnienie tej wartości w czasie wykonywania w celu przejścia do funkcji to_utc_timestamp.

select D1, 
     D1E, 
     D1L, 
     D1LT, 
     D1LZ, 
     to_utc_timestamp(D1LT, D1LZ) as D1UTC 
from (
select D1, 
     D1E, 
     D1L, 
     regexp_extract(D1L, '^([^ ]+[ ][^ ]+)[ ](.+)$', 1) as D1LT, 
     regexp_extract(D1L, '^([^ ]+[ ][^ ]+)[ ](.+)$', 2) as D1LZ 
from (
select D1, 
     D1E, 
     from_unixtime(D1E, 'yyyy-MM-dd HH:mm:ss z') as D1L 
from (
select D1, 
     unix_timestamp(D1,'yyyy-MM-dd HH:mm:ss Z') as D1E 
from (
select '2015-08-24 01:15:23 UTC' as D1 
from tblFiniteZahl 
limit 1 
    ) T1 
    ) T2 
    ) T3 
    ) T4 
; 

Rezultatem jest

D1 = 2015-08-24 01:15:23 UTC 
DT3 = 1440378923 
D1L = 2015-08-23 21:15:23 EDT 
D1LT = 2015-08-23 21:15:23 
D1LZ = EDT 
D1UTC = 2015-08-23 21:15:23 

ten ilustruje, że to_utc_timestamp bierze drugi argument EDT.

3

Hej, chciałem tylko dodać trochę tutaj, sugerowałbym próbę "automatyzacji" strefy czasowej systemu. Więc zamiast statycznie

#STATIC TZ deceleration  
to_utc_timestamp(from_unixtime(1389802875),'America/Montreal') 

Daj to strzał

#DYNAMIC TZ 
select to_utc_timestamp(from_unixtime(1389802875), from_unixtime(unix_timestamp(), "z")); 

To właśnie wykorzystuje format wyjściowy ciąg „from_unixtime”, aby powrócić ciąg strefy czasowej (małe oo)

Powiązane problemy