Jaki jest najłatwiejszy sposób uzyskania aktualnego czasu GMT w formacie uniksowego znacznika czasu?

175

Python oferuje różne pakiety ( datetime, time, calendar) jak można zobaczyć tutaj w celu uporania się z czasem. Popełniłem duży błąd, korzystając z poniższego, aby uzyskać aktualny czas GMTtime.mktime(datetime.datetime.utcnow().timetuple())

Jaki jest prosty sposób na uzyskanie aktualnego czasu GMT w sygnaturze czasowej Uniksa?

Cory
źródło
1
Co to jest wejście / wyjście? datetime.utcnow()zwraca bieżący czas UTC jako obiekt daty i godziny (zakładam, że chcesz użyć UTC, kiedy mówisz o „czasie GMT”). time.time()zwraca uniksowy znacznik czasu bezpośrednio jako liczbę zmiennoprzecinkową. Oto jak przekonwertować datetime.date/datetime.datetime reprezentujący czas w UTC na sygnaturę czasową POSIX .
jfs
Czy proponowana przez Ciebie metoda jest błędna, czy po prostu zbyt szczegółowa? Związane z: stackoverflow.com/questions/15940280/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
Dlaczego twoja metoda była błędem?
skeller88,

Odpowiedzi:

230

Użyłbym time.time (), aby uzyskać znacznik czasu w sekundach od epoki.

import time

time.time()

Wynik:

1369550494.884832

W przypadku standardowej implementacji CPythona na większości platform zwróci to wartość UTC.

Edmond Burnett
źródło
21
Problem polega na tym, że lokalny zegar twojego komputera może być inny niż UTC.
9000
@ 9000: Dobrze, chociaż zawsze nalegałbym na UTC w każdym środowisku, w którym czas ma znaczenie. I poprosił o najprostsze rozwiązanie. Zauważ, że w przypadku CPython na nowoczesnych platformach, w tym Linux, BSD, Mac OS X i Windows, wszystkie zwracają czas UTC dla time.time (). Odzwierciedla to zachowanie funkcji czasu biblioteki standardowej C w tych systemach operacyjnych.
Edmond Burnett
66
@ 9000: lokalna strefa czasowa nie ma znaczenia. Czas uniksowy odpowiada czasowi UTC (jeśli pominiemy czas w okolicach sekund przestępnych). Pomyśl o tym: znacznik czasu to liczba sekund, które upłynęły od epoki (ustalony moment w czasie): dlaczego miałoby to zależeć od tego, jakiego lokalnego zegara używa maszyna ze strefą czasową? W dowolnym momencie czas uniksowy jest taki sam na całym świecie. Niektóre (nieznane) platformy mogą używać innej epoki, ale jej wartość nadal nie byłaby zależna od lokalnej strefy czasowej.
jfs
stackoverflow.com/questions/13890935/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
125
import time

int(time.time()) 

Wynik:

1521462189
Maks
źródło
42

czy to pomaga?

from datetime import datetime
import calendar

d = datetime.utcnow()
unixtime = calendar.timegm(d.utctimetuple())
print unixtime

Jak przekonwertować obiekt datetime w języku Python na znacznik czasu UNIX

Nick Caplinger
źródło
@Cairnarvon To był tylko przykład. Jeśli chcesz mieć aktualny znacznik czasu, możesz po prostu zadzwonić time.time()i nie potrzebujesz w ogóle konwersji daty i godziny.
Messa
1
FWIW: To nie jest czas UTC, jest to UTC przekonwertowany na czas lokalny. Aby uzyskać znacznik czasu w UTC, musisz zrobić coś innego.
Sherlock70
18

Lub po prostu używając standardowego modułu datetime

In [2]: from datetime import timezone, datetime
   ...: int(datetime.now(tz=timezone.utc).timestamp() * 1000)
   ...: 
Out[2]: 1514901741720

W zależności od żądanej rozdzielczości można obcinać lub mnożyć. Ten przykład generuje milis.

Jeśli chcesz mieć poprawną sygnaturę czasową Uniksa (w sekundach), usuń plik* 1000

Maresh
źródło
Twój kod bardzo konkretnie wymusza zmianę czasu na liczbę całkowitą, więc jestem zdezorientowany, dlaczego tekst wyjściowy jest liczbą dziesiętną?
Weston
O mój
Boże
To jest dokładny odpowiednik momentbiblioteki Javascript moment().utc().valueOf(). Dokładnie to, czego szukałem. Dzięki
azhar22k
Od 1970 roku datownik UNIX powinien wskazywać sekundy . Twoje rozwiązanie tego nie daje.
jazda na nartach
1
„Możesz skracać lub mnożyć w zależności od żądanej rozdzielczości” Porzuć część * 1000, a otrzymasz sekundy.
Maresh
18

python2 i python3

dobrze jest skorzystać z modułu czasowego

import time
int(time.time())

1573708436

możesz także użyć modułu datetime, ale kiedy używasz strftime ('% s'), ale strftime konwertuje czas na czas lokalny!

python2

from datetime import datetime
datetime.utcnow().strftime('%s')

python3

from datetime import datetime
datetime.utcnow().timestamp()
MikA
źródło
2
Będąc w UTC + 1, time.time()i datetime.utcnow().timestamp()czy nie dać taką samą wartość!
user136036
Chociaż spodziewałem się, że druga opcja będzie poprawna, musiałem użyć datetime.now (). Timestamp (), aby uzyskać poprawną wartość w UTC + 1100. Spodziewałem się, że znacznik czasu () będzie działał poprawnie w obu przypadkach, ale wydaje się, że tak nie jest
David Waterworth
Przyglądając się bliżej, zarówno datetime.utcnow (), jak i datetime.now () zwracają naiwną datęetime (bez tzinfo), a timestamp () wydaje się przyjmować lokalną, gdy tzinfo = null.
David Waterworth
2

Podoba mi się ta metoda:

import datetime, time

dts = datetime.datetime.utcnow()
epochtime = round(time.mktime(dts.timetuple()) + dts.microsecond/1e6)

Inne zamieszczone tutaj metody nie gwarantują podania czasu UTC na wszystkich platformach lub zgłaszają tylko pełne sekundy. Jeśli chcesz mieć pełną rozdzielczość, działa to z dokładnością do mikro-sekundy.

vschmidt
źródło
1
Niestety nie wydaje się, aby to dawało UTC, chyba że znajdujesz się w strefie czasowej UTC + 0000. Używanie utctimetuplezamiast tego załatwia sprawę.
jazda na nartach
1
from datetime import datetime as dt
dt.utcnow().strftime("%s")

Wynik:

1544524990
2ni
źródło
to nie wraca tak samo jak time.time()u mnie.
Alwinius
1
Dzieje się tak prawdopodobnie dlatego, że dt.utcnowzwraca datetimebez informacji o strefie czasowej. Następnie strftimezakłada, że datetimejest to czas lokalny.
jazda na nartach
1
@skyking To jest problem prawie wszystkich odpowiedzi na tej stronie!
David Waterworth
1
#First Example:
from datetime import datetime, timezone    
timstamp1 =int(datetime.now(tz=timezone.utc).timestamp() * 1000)
print(timstamp1)

Wyjście: 1572878043380

#second example:
import time
timstamp2 =int(time.time())
print(timstamp2)

Wyjście: 1572878043

  • Tutaj widzimy, że pierwszy przykład podaje dokładniejszy czas niż drugi.
  • Tutaj używam pierwszego.
Chandan Sharma
źródło
1

Przynajmniej w python3 działa to:

>>> datetime.strftime(datetime.utcnow(), "%s")
'1587503279'
numer użytkownika
źródło