Python: konwertuj krotkę czasu UTC na znacznik czasu UTC

Mój problem: muszę przekonwertować krotkę czasu UTC na znacznik czasu UTC. Ale mam pewne zamieszanie.

Najpierw trochę informacji:

time.mktime(tuple): ta funkcja zawsze zwraca znacznik czasu wlokalny czas.

Jest to odwrotna funkcja czasu lokalnego (). Jego argumentem jest struct_time lub pełna 9-krotka, która wyraża czas wczas lokalny, a nie UTC.

calendar.timegm(tuple): zwracaZnacznik czasu UTC od dostarczonej krotki czasu

pobiera krotkę czasu, taką jak zwrócona przez funkcję gmtime () w module czasu, i zwraca odpowiednią wartość uniksowego znacznika czasu. W rzeczywistości,time.gmtime () i timegm () są nawzajem odwrotne

Zróbmy teraz test:

>>> from datetime import datetime
>>> import time
>>> import calendar as cal

>>> utc_now = datetime.utcnow()
>>> now = datetime.now()
>>> utc_now
datetime.datetime(2013, 3, 16, 9, 17, 22, 489225)
>>> now
datetime.datetime(2013, 3, 16, 5, 17, 29, 736903)

>>> time.mktime(datetime.timetuple(utc_now)), time.mktime(datetime.timetuple(now))
(1363439842.0, 1363425449.0)
>>> cal.timegm(datetime.timetuple(utc_now)), cal.timegm(datetime.timetuple(now))
(1363425442, 1363411049)

Dlaczego są cztery różne wartości? A który z nich jest właściwy, gdy chcę przekonwertować krotkę czasu UTC na znacznik czasu UTC?

UPDATTE

Myślę, że znalazłem odpowiedzi na moje zamieszanie, więc pozwól mi wyjaśnić.

Po pierwsze, musimy wiedzieć coś ważnego:

Istnieją dwa rodzaje obiektów daty i czasu: „naiwny” i „świadomy”.

Świadomy obiekt ma wystarczającą wiedzę na temat odpowiednich algorytmicznych i politycznych korekt czasu, takich jak strefa czasowa i informacje o czasie letnim, aby zlokalizować się względem innych świadomych obiektów. Obiekt świadomy jest używany do reprezentowania określonego momentu w czasie, który nie jest otwarty na interpretację [1].

Obiekt naiwny nie zawiera wystarczającej ilości informacji, aby jednoznacznie zlokalizować się względem innych obiektów daty / czasu.To, czy naiwny obiekt reprezentuje skoordynowany czas uniwersalny (UTC), czas lokalny lub czas w innej strefie czasowej, zależy wyłącznie od programu, podobnie jak program zależy od tego, czy konkretna liczba reprezentuje metry, mile lub masy. Obiekty naiwne są łatwe do zrozumienia i pracy, kosztem ignorowania niektórych aspektów rzeczywistości.

Co otrzymujemydatetime.utcnow() lubdatetime.now() są obiektami „naiwnymi”. Oznacza to, żedatetime obiekt, który jest zwracany, w żadnym wypadku nie mówi nic o czasie lokalnym lub czasie UTC - reprezentuje po prostu „jakiś czas”. Zawiera tylko informacje o dacie i godzinie (rok, miesiąc, dzień, godzina, minuty, sekundy itd.). Twoim obowiązkiem jest powiązanie go z pojęciem lokalnym lub UTC.

Pamiętaj więc, że naiwny obiekt datetime reprezentuje „jakiś czas”. Thedatetime.now() funkcja zwraca „jakiś czas”, który jest równy bieżącemu czasowi idatetime.utcnow() funkcja zwraca „jakiś czas”, czyli aktualny czas w Greenwich w Anglii (co jest tym, czym jest UTC).

„Trochę czasu” to tylko wartość daty i godziny. I zauważ, że w różnych miejscach na ziemi „jakiś czas” występuje w różnych czasach. Na przykład, jeśli wartość „jakiś czas” to 1 stycznia, 10:30, to będzie to aktualny czas w Greenwich England około 5 godzin PRZED tym, jak stanie się aktualnym czasem w Nowym Jorku.

Widzimy zatem, że istnieją dwie rzeczy: ogólna wartość „trochę czasu” i pogląd, że „jakiś czas” staje się aktualnym czasem w różnych miejscach w różnych „czasach”. (tutaj nie ma słów, czytaj dalej)

Najpierw zdefiniujmy, co jest „epoką”. Wiemy, że „jakiś czas” to tylko ogólna wartość czasu. Następnie epoka jest „czasem”, który miał miejsce w Greenwich w Anglii, gdzie wartości parametrów są następujące:January 1 1970, 00:00:00.

„Znacznik czasu” to nie. sekund, które upłynęły od epoki. Oznacza to, że znacznik czasu był0 kiedy był czasJan 1, 1970, 00:00:00 w Greenwich w Anglii. Ale znacznik czasu był ok. (5 * 60 * 60), gdy był czasJan 1, 1970, 00:00:00 w Nowym Jorku.

>>> tt = datetime.timetuple(datetime(1970, 1, 1, 0, 0, 0))
>>> cal.timegm(tt)
0

Widzimy więc, że ta sama wartość „trochę czasu”Jan 1, 1970, 00:00:00 ma różne znaczniki czasu, gdy zmieniamy lokalizację. Stąd, gdy mówisz o sygnaturze czasowej, musisz również powiedzieć, „jaka lokalizacja” jest datownikiem związanym z tym, a ile na wschód lub zachód ta lokalizacja jest powiązana z Greenwich w Anglii. Ta lokalizacja jest wyrażona jako „strefa czasowa”.

Teraz każdy system (komputer) ma skonfigurowaną strefę czasową i wszystkie znaczniki czasu związane z tą strefą czasową stają się faktycznie „lokalnymi”. UTC jest globalnym odniesieniem.

Powiedzmy, że maszX wartość „jakiś czas”, która zmienia się na:

Y znacznik czasu w czasie lokalnymZ znacznik czasu w UTC

wtedy to znaczyY Nie. sekund będzie musiało upłynąć, zanim „jakiś czas” stanie się aktualnym czasem w Twojej lokalizacji iZ żadna sekunda nie będzie musiała minąć, aby aktualny czas w Greenwich w Anglii stał się „czasem”.

Wróćmy teraz do naszych funkcjimktime itimegm. Zajmują one krotkę czasu, która jest po prostu kolejną reprezentacją dla „jakiegoś czasu”. Pamiętaj, że przekazujemy im naiwny czas, który nie ma pojęcia lokalnego lub UTC.

PowiedzmyX jest krotką czasu reprezentującą naiwny „jakiś czas”. Następnie

mktime(X) zwróci nie. sekund, które będą musiały upłynąć, aby lokalny aktualny czas stał się „czasem” itimegm(X) zwróci brak sekund, które będą musiały zostać wydane, aby bieżący czas Greenwich w Anglii był równy temu „trochę czasu”.

W powyższym przykładzienow iutc_now reprezentują naiwny „jakiś czas” i kiedy karmimy te wartości „czasem”mktime itimegm, po prostu zwracają nie. sekund, które muszą upłynąć, aby odpowiednie lokalizacje (twoja lokalizacja i Greenwich England) miały swój obecny czas jako „trochę czasu”.

Wracając do mojego problemu: muszę przekonwertować krotkę czasu UTC na znacznik czasu UTC.

Po pierwsze, nie ma pojęcia „krotka czasowa UTC” - to tylko „trochę czasu”. Jeśli muszę przekonwertować go na UTC, po prostu używamtimegm:

cal.timegm(datetime.timetuple(utc_now))

który da mi znacznik czasu dla bieżącego czasu UTC (tj. aktualny „jakiś czas” w Greenwich w Anglii).

questionAnswers(1)

yourAnswerToTheQuestion