Czy time.time()
w module czasu Python zwraca czas systemowy czy czas w UTC?
Czy time.time()
w module czasu Python zwraca czas systemowy czy czas w UTC?
Odpowiedzi:
time.time()
Funkcja zwraca liczbę sekund od początku epoki, jak sekund. Należy pamiętać, że „epoka” jest zdefiniowana jako początek 1 stycznia 1970 r. W UTC. Tak więc epoka jest zdefiniowana w kategoriach UTC i ustanawia globalny moment w czasie. Bez względu na to, gdzie jesteś „sekund po epoce” (time.time ()) zwraca tę samą wartość w tym samym momencie.
Oto kilka przykładowych danych wyjściowych, które uruchomiłem na komputerze, a także przekonwertowałem na ciąg.
Python 2.7.3 (default, Apr 24 2012, 00:00:54)
[GCC 4.7.0 20120414 (prerelease)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import time
>>> ts = time.time()
>>> print ts
1355563265.81
>>> import datetime
>>> st = datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S')
>>> print st
2012-12-15 01:21:05
>>>
ts
Zmienny jest czas zwrócony w ciągu kilku sekund. Następnie przekonwertowałem go na ciąg znaków za pomocą datetime
biblioteki, dzięki czemu jest to ciąg czytelny dla ludzi.
import time
skoro datetime zasadniczo daje ci znacznik czasu? Po prostu usuń milisekundy -str(datetime.datetime.now()).split('.')[0]
time.time()
nie znajduje się w żadnej strefie czasowej . „sekundy od epoki” to termin; nie upłynęły sekundy od pewnego momentu (epoki). Możesz łatwo przekonwertować go na czas lokalny (z bazą danych tz) i / lub strefę czasową UTC. btw, jeśli upuścisz .strftime()
wynik jest (prawie) taki sam (+/- mikrosekund).
Jest to forma tekstowa znacznika czasu, którego można używać w plikach tekstowych. (W przeszłości tytuł pytania był inny, więc wprowadzenie do tej odpowiedzi zostało zmienione, aby wyjaśnić, jak można ją interpretować jako czas. [Zaktualizowano 14.01.2016])
Można uzyskać znacznik czasu jako ciąg przy użyciu .now()
lub .utcnow()
z datetime.datetime
:
>>> import datetime
>>> print datetime.datetime.utcnow()
2012-12-15 10:14:51.898000
W now
różni się od utcnow
jak oczekiwano - w przeciwnym razie one działają w ten sam sposób:
>>> print datetime.datetime.now()
2012-12-15 11:15:09.205000
Możesz jawnie renderować znacznik czasu w ciągu:
>>> str(datetime.datetime.now())
'2012-12-15 11:15:24.984000'
Lub możesz być jeszcze bardziej wyraźny, aby sformatować znacznik czasu tak, jak chcesz:
>>> datetime.datetime.now().strftime("%A, %d. %B %Y %I:%M%p")
'Saturday, 15. December 2012 11:19AM'
Jeśli chcesz format ISO, użyj .isoformat()
metody obiektu:
>>> datetime.datetime.now().isoformat()
'2013-11-18T08:18:31.809000'
Możesz użyć ich w zmiennych do obliczeń i drukowania bez konwersji.
>>> ts = datetime.datetime.now()
>>> tf = datetime.datetime.now()
>>> te = tf - ts
>>> print ts
2015-04-21 12:02:19.209915
>>> print tf
2015-04-21 12:02:30.449895
>>> print te
0:00:11.239980
import datetime; print "%s: My timestamp message" % datetime.datetime.utcnow()
Python3:import datetime; print ("%s: My timestamp message" % datetime.datetime.utcnow())
datetime.datetime.utcnow()
jest zły. Tworzy naiwny czas danych, który nie jest czasem lokalnym. O ile Twój czas lokalny to UTC, będzie NIEPRAWIDŁOWY. Użyj datetime.datetime.now(datetime.timezone.utc)
zamiast tego. Spowoduje to utworzenie strefy czasowej uwzględniającej strefę czasową reprezentującą bieżącą godzinę.
W oparciu o odpowiedź z #squiguy, aby uzyskać prawdziwy znacznik czasu, napisałbym: cast z float.
>>> import time
>>> ts = int(time.time())
>>> print(ts)
1389177318
Przynajmniej taka jest koncepcja.
type(time.time())
daje<type 'float'>
int()
jest polimorficzny. Zwróci, long
jeśli to konieczne, w starych wersjach Pythona - wszystkie liczby całkowite są długie w nowych wersjach Pythona.
Odpowiedź może być nie na jedno lub oba.
none: time.time()
zwraca przybliżoną liczbę sekund, które upłynęły od Epoki. Wynik nie zależy od strefy czasowej, więc nie jest to ani czas UTC, ani czas lokalny. Oto definicja POSIX dla „Seconds Since the Epoch” .
oba: time.time()
nie wymaga synchronizacji zegara systemowego, więc odzwierciedla jego wartość (chociaż nie ma to nic wspólnego z lokalną strefą czasową). Różne komputery mogą uzyskiwać różne wyniki w tym samym czasie. Z drugiej strony, jeśli czas komputera jest zsynchronizowany, łatwo jest uzyskać czas UTC z datownika (jeśli zignorujemy sekundy przestępne):
from datetime import datetime
utc_dt = datetime.utcfromtimestamp(timestamp)
O tym, jak uzyskać znaczniki czasu z czasu UTC w różnych wersjach Pythona, zobacz Jak mogę przekonwertować datę na sekundy od epoki zgodnie z UTC?
datetime.utcfromtimestamp
podczas gdy na odpowiedzi jest 308 głosów pozytywnych z datetime.fromtimestamp
:-(
time.time()
funkcja zwraca (jest bardzo krótka). Twój komentarz odnosi się do innego pytania (zmieniłeś swój komentarz, odkąd zacząłem na nie odpowiadać. Gorzej). Nota boczna; słowa „poprawne” należy używać oszczędnie (strefy czasowe są skomplikowane - nie ma srebrnej kuli - tylko kompromisy dla konkretnego przypadku użycia).
datetime.datetime.utcfromtimestamp(ts)
. O ile Twój czas lokalny nie jest UTC, będzie NIEPRAWIDŁOWY, ponieważ tworzy naiwny czas danych, który nie jest czasem lokalnym. Użyj datetime.datetime.fromtimestamp(ts,datetime.timezone.utc)
zamiast tego. To tworzy strefę czasową uwzględniającą strefę czasową reprezentującą ten sam moment co znacznik czasu.
naive_dt.astimezone()
żeby nie istniało tak, jak ukryte, bytes.encode()
nie istnieje już w Pythonie 3. Prawdą jest, że w wielu przypadkach korzystna jest wewnętrzna praca z czasem UTC. Jest wiele rzeczy, które można powiedzieć o module datetime (odpowiedziałem na wystarczającą liczbę pytań, aby uzyskać złotą odznakę), większość nie mieści się w pytaniu: co time.time()
zwraca.
W końcu zdecydowałem się na:
>>> import time
>>> time.mktime(time.gmtime())
1509467455.0
time.time()
zwraca 1574115250.818733
int(time.time() * 1000)
1574115254915
W określonej strefie czasowej nie ma czegoś takiego jak „epoka”. Epoka jest dobrze zdefiniowana jako konkretny moment w czasie, więc jeśli zmienisz strefę czasową, zmieni się również sam czas. Tym razem jest to czas Jan 1 1970 00:00:00 UTC
. time.time()
Zwraca więc liczbę sekund od epoki.
znacznik czasu jest zawsze czasem w utc, ale gdy datetime.datetime.fromtimestamp
go wywołujesz , zwraca on czas w lokalnej strefie czasowej odpowiadający temu znacznikowi czasu, więc wynik zależy od ustawień regionalnych.
>>> import time, datetime
>>> time.time()
1564494136.0434234
>>> datetime.datetime.now()
datetime.datetime(2019, 7, 30, 16, 42, 3, 899179)
>>> datetime.datetime.fromtimestamp(time.time())
datetime.datetime(2019, 7, 30, 16, 43, 12, 4610)
Istnieje ładna biblioteka arrow
o różnych zachowaniach. W tym samym przypadku zwraca obiekt czasowy ze strefą czasową UTC.
>>> import arrow
>>> arrow.now()
<Arrow [2019-07-30T16:43:27.868760+03:00]>
>>> arrow.get(time.time())
<Arrow [2019-07-30T13:43:56.565342+00:00]>