Jak uzyskać liczbę sekund, które upłynęły od epoki od czasu i daty wyjścia funkcji gmtime ()?

162

Jak odwrócić gmtime(), gdzie umieszczasz czas + datę i uzyskujesz liczbę sekund?

Mam ciągi znaków jak 'Jul 9, 2009 @ 20:02:58 UTC'i chcę odzyskać liczbę sekund między epoką a 9 lipca 2009 r.

Próbowałem, time.strftimeale nie wiem, jak go poprawnie używać lub czy jest to właściwe polecenie.

calccrypto
źródło

Odpowiedzi:

123

Jeśli trafiłeś tutaj, ponieważ wyszukiwarka powiedziała ci, jak uzyskać uniksowy znacznik czasu, przestań czytać tę odpowiedź. Przewiń jeden w dół.

Jeśli chcesz cofnąć time.gmtime(), chcesz calendar.timegm().

>>> calendar.timegm(time.gmtime())
1293581619.0

Możesz przekształcić swój ciąg w krotkę czasu za pomocą time.strptime(), która zwraca krotkę czasu, do której możesz przejść calendar.timegm():

>>> import calendar
>>> import time
>>> calendar.timegm(time.strptime('Jul 9, 2009 @ 20:02:58 UTC', '%b %d, %Y @ %H:%M:%S UTC'))
1247169778

Więcej informacji o module kalendarza tutaj

nmichaels
źródło
16
Jeśli szukasz aktualnej epoki unixowej, zapoznaj się z komentarzem @ DanJ lub odpowiedzią naren, ta odpowiedź jest nieprawidłowa!
kosii
641

Skorzystaj z modułu czasu :

epoch_time = int(time.time())
naren
źródło
14
@DanJ: jest to liczba sekund, które upłynęły od Epoki (stały moment w czasie) i jest taka sama w każdej strefie czasowej. Chociaż jeśli zignorujemy instancje czasowe w okolicach sekund przestępnych; łatwo jest przekonwertować go na UTC, jeśli timeużywa się epoki uniksowej (1970).
jfs
43
Uwaga to nie jest to, co zostało z prośbą o OP, ale to, co ja chciałem. Więc +1.
Fearless_fool
6
to odpowiedź na pytanie zawarte w tytule: „ustalenie czasu od epoki”. +1
AlejandroVD
@JFSebastian to daje epokę sekundom. Jak mogę uzyskać rozdzielczość do milisekund, używając tej samej powyższej odpowiedzi?
Marlon Abeykoon
2
przedłużyć mój komentarz powyżej : time.time()wartość nie zależy od lokalnej strefy czasowej (jeśli wykluczymy „prawo” strefy czasowe i tym podobne), na przykład, jeśli zwróci czas POSIX (jak ma to miejsce w większości systemów), jest to liczba sekund SI od Epoka (1970-01-01UTC) nie licząc sekund przestępnych. Wartość tę można przeliczyć na UTC (z wyłączeniem sekund przestępnych), ale nie jest to UTC . @MarlonAbeykoon: Podoba mi się ta odpowiedź
jfs
10

Zauważ, że time.gmtimemapuje znacznik czasu 0do 1970-1-1 00:00:00.

In [61]: import time       
In [63]: time.gmtime(0)
Out[63]: time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)

time.mktime(time.gmtime(0)) podaje sygnaturę czasową przesuniętą o kwotę zależną od ustawień regionalnych, która generalnie nie może wynosić 0.

In [64]: time.mktime(time.gmtime(0))
Out[64]: 18000.0

Odwrotnością time.gmtimejest calendar.timegm:

In [62]: import calendar    
In [65]: calendar.timegm(time.gmtime(0))
Out[65]: 0
unutbu
źródło
To daje lepsze wyjaśnienie i przykładem dla time.mktime (co brać pod uwagę aktualną strefę czasową), dzięki
JKM
@Jkm: NIE używaj mktime()z gmtime(). mktime()akceptuje Twój czas lokalny, ale gmtime()zwraca czas UTC - Twoja lokalna strefa czasowa może i prawdopodobnie będzie inna. "Znacznik czasu w stosunku do twojego locale" nie ma sensu: POSIX timestamp nie zależy od twojego locale (lokalna strefa czasowa) - ma tę samą wartość na całym świecie. „Sekundy od epoki” to w większości przypadków sygnatura czasowa POSIX (nawet w systemie Windows) - takie rzeczy jak „właściwe” strefy czasowe używające skali czasu TAI nie są powszechne. Zobacz Czy time.time () języka Python zwraca lokalny lub UTC znacznik czasu?
jfs
@JF Sebastian Masz rację. Właściwie mktime()ostatnio mam kilka problemów . W przypadku niektórych serwerów WWW w Pythonie (na przykład Tornado), ponieważ proces działa, nawet jeśli zmienię ustawienia regionalne systemu, mktime()wywoływany przez serwer sieciowy interfejs API nadal korzysta ze starej strefy czasowej do generowania obiektu czasu. Muszę przełączyć się na gmtime()i ręcznie zastosować przesunięcie gmt.
Jkm
5
ep = datetime.datetime(1970,1,1,0,0,0)
x = (datetime.datetime.utcnow()- ep).total_seconds()

Powinno się to różnić od int(time.time()), ale można bezpiecznie użyć czegoś takiego jakx % (60*60*24)

datetime - Podstawowe typy daty i czasu:

W przeciwieństwie do modułu czasu moduł datetime nie obsługuje sekund przestępnych.

user3226167
źródło
3
t = datetime.strptime('Jul 9, 2009 @ 20:02:58 UTC',"%b %d, %Y @ %H:%M:%S %Z")
Falmarri
źródło
Z jakiegoś powodu nie mogę uzyskać dostępu do strptime. Zaimportowałem datetime
calccrypto
1
@calccrypto musisz albo from datetime import datetimealbo zrobićdatetime.datetime.strptime
pathikrit