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?


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.


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



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


@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


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

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.


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

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.