Czy czas Pythona.time () zwraca lokalny lub UTC znacznik czasu?

Czy time.time() w module czasowym Pythona zwraca Czas systemu lub czas w UTC?

8 answers

The time.time() funkcja zwraca liczbę sekund od epoki, jako sekundy. Zauważ, że "epoka" jest zdefiniowana jako początek 1 stycznia 1970 roku w UTC. Tak więc Epoka jest zdefiniowana w kategoriach UTC i ustanawia globalny moment w czasie. Bez względu na to, gdzie jesteś "seconds past epoch" (czas.time()) zwraca tę samą wartość w tym samym momencie.

Oto Przykładowe wyjście, które uruchomiłem na moim komputerze, konwertując je również na ciąg znaków.

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
>>>

Zmienna ts jest czas zwracany w sekundach. Następnie przekonwertowałem go na ciąg znaków za pomocą biblioteki datetime, czyniąc go ciągiem czytelnym dla człowieka.

 828
Author: squiguy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-23 16:52:07

Jest to dla forma tekstowa znacznika czasu , który może być używany w plikach tekstowych. (Tytuł pytania był w przeszłości inny, więc wstęp do tej odpowiedzi został zmieniony, aby wyjaśnić, jak można go interpretować jako czas. [aktualizacja 2016-01-14])

Możesz uzyskać znacznik czasu jako ciąg znaków za pomocą .now() lub .utcnow() z datetime.datetime:

>>> import datetime
>>> print datetime.datetime.utcnow()
2012-12-15 10:14:51.898000

now różni się od utcnow zgodnie z oczekiwaniami - w przeciwnym razie działają w ten sam sposób:

>>> print datetime.datetime.now()
2012-12-15 11:15:09.205000

Możesz renderować znacznik czasu do łańcucha jawnie:

>>> 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 mieć format ISO, użyj metody .isoformat() obiektu:

>>> datetime.datetime.now().isoformat()
'2013-11-18T08:18:31.809000'

Można ich używać 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
 315
Author: pepr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-12-01 19:53:32

Na podstawie odpowiedzi z # squiguy, aby uzyskać prawdziwy znacznik czasu, wpisałbym cast it z float.

>>> import time
>>> ts = int(time.time())
>>> print(ts)
1389177318
Przynajmniej taka jest koncepcja.
 145
Author: Rudi Strydom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-08 10:37:55

Odpowiedź może być jedno i drugie.

  • Ani: time.time() zwraca w przybliżeniu liczbę sekund, które upłynęły od epoki. Wynik nie zależy od strefy czasowej, więc nie jest to czas UTC ani lokalny. Oto definicja POSIX dla "sekund od epoki" .

  • Both: time.time() nie wymaga synchronizacji zegara systemowego, więc odzwierciedla jego wartość (choć nie ma to nic wspólnego z lokalną strefą czasową). Różne komputery mogą się różnić wyniki w tym samym czasie. Z drugiej strony, jeśli czas komputera jest zsynchronizowany , łatwo jest uzyskać czas UTC ze znacznika czasu (jeśli ignorujemy sekundy przestępne):

    from datetime import datetime
    
    utc_dt = datetime.utcfromtimestamp(timestamp)
    

Jak uzyskać znaczniki czasu z czasu UTC w różnych wersjach Pythona, zobacz Jak mogę uzyskać datę przekonwertowaną na sekundy od epoki zgodnie z UTC?

 30
Author: jfs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:10:45

W końcu zdecydowałem się na:

>>> import time
>>> time.mktime(time.gmtime())
1509467455.0
 4
Author: Natim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-31 17:32:23

Nie ma czegoś takiego jak "epoka" w określonej strefie czasowej. Epoka jest dobrze zdefiniowana jako konkretny moment w czasie, więc jeśli zmienisz strefę czasową, sam czas również się zmienia. Konkretnie, tym razem jest Jan 1 1970 00:00:00 UTC. Więc time.time() Zwraca liczbę sekund od epoki.

 3
Author: HyperNeutrino,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-20 00:07:43

Timestamp jest zawsze czasem w utc, ale gdy wywołujesz datetime.datetime.fromtimestamp zwraca ci czas w lokalnej strefie czasowej odpowiadającej 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 z innym zachowaniem. W tym samym przypadku zwraca obiekt czasu z 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]>
 3
Author: Ryabchenko Alexander,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-10-29 10:26:45

Aby uzyskać lokalny znacznik czasu za pomocą biblioteki datetime, Python 3.x

#wanted format: year-month-day hour:minute:seconds

from datetime import datetime

# get time now
dt = datetime.now()
# format it to a string
timeStamp = dt.strftime('%Y-%m-%d %H:%M:%S')

# print it to screen
print(timeStamp)
 3
Author: Harry,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-14 22:56:14