Jak uzyskać czas UTC w Pythonie?

112

Przeszukałem grupę na StackExchange w poszukiwaniu rozwiązania, ale nic nie robi tego, czego potrzebuję. W JavaScript używam następujących do obliczania czasu UTC od 1 stycznia 1970:

function UtcNow() {
    var now = new Date();
    var utc = Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate(), now.getUTCHours(), now.getUTCMinutes(), now.getUTCSeconds(), now.getUTCMilliseconds());
    return utc;
}

Jaki byłby równoważny kod w Pythonie?

James Clarke
źródło
Czekaj, czy używasz języka Python czy JavaScript?
CheetSheatOverlode

Odpowiedzi:

179

Wypróbuj ten kod, który używa datetime.utcnow () :

from datetime import datetime
datetime.utcnow()

Jeśli chcesz obliczyć ilość czasu spędzonego między dwiema datami, wystarczy odjąć datę końcową i początkową. Wynikiem takiego odejmowania jest obiekt timedelta.

Z dokumentacji Pythona:

class datetime.timedelta([days[, seconds[, microseconds[, milliseconds[, minutes[, hours[, weeks]]]]]]])

A to oznacza, że ​​domyślnie możesz otrzymać dowolne z pól wymienionych w jego definicji - dni, sekundy, mikrosekundy, milisekundy, minuty, godziny, tygodnie. Instancja timedelta ma również metodę total_seconds (), która:

Zwraca całkowitą liczbę sekund zawartych w czasie trwania. Równoważne z (td.microseconds + (td.seconds + td.days * 24 * 3600) * 10 * 6) / 10 * 6 obliczonym z włączonym prawdziwym dzieleniem.

Artsiom Rudzenka
źródło
2
prawdopodobnie nieprzyjemną niespodzianką związaną z datetime.utcnow () jest to, że pomimo nazwy nie zwraca obiektu obsługującego strefę czasową. To moim zdaniem duży problem, dlatego wolę moją odpowiedź poniżej. Zobacz „Obiekty daty i godziny bez strefy czasowej powinny być traktowane jako„ błąd ”w aplikacji”. julien.danjou.info/python-and-timezones
Tim Richardson
1
Koncepcja tak zwanego naiwnego obiektu daty i godziny (tj. Nie ustawiono informacji o strefie czasowej) ma jakiś cel: chcę, aby mój budzik dzwonił o 06:00 każdego dnia, bez względu na to, gdzie na świecie jestem. Pozwala także na „wirtualne zegary” w, powiedzmy, grach komputerowych: w moim świecie fantasy jest teraz godzina 17:00. Wymuszenie strefy czasowej na obiekcie datetime byłoby niewygodne, szczególnie w przypadku arytmetyki timedelta.
DustByte
42

W formie najbliższej oryginałowi:

import datetime

def UtcNow():
    now = datetime.datetime.utcnow()
    return now

Jeśli chcesz znać liczbę sekund z 1970-01-01, a nie natywny Python datetime, użyj tego:

return (now - datetime.datetime(1970, 1, 1)).total_seconds()

Python ma konwencje nazewnictwa, które są sprzeczne z tym, do czego możesz być przyzwyczajony w JavaScript, zobacz PEP 8 . Ponadto funkcja, która po prostu zwraca wynik innej funkcji, jest raczej głupia; jeśli chodzi tylko o uczynienie jej bardziej dostępną, możesz utworzyć inną nazwę dla funkcji, po prostu ją przypisując. Pierwszy powyższy przykład można zastąpić:

utc_now = datetime.datetime.utcnow
Mark Okup
źródło
1
Twoja odpowiedź podoba mi się bardziej niż wyżej oceniona powyżej. Dziękuję za głębię tutaj.
Jordan Dea-Mattson,
@Jordan, patrząc wstecz na moją odpowiedź, zdaję sobie sprawę, że popełniłem stylistyczny błąd, umieszczając import wewnątrz funkcji, a nie na poziomie globalnym. Teraz to naprawię.
Mark Ransom
8
Może powinieneś rozważyć umieszczenie UtcNow () w innej funkcji. To zbyt proste. Nie używaj też podkreśleń. PEP 8 jest taki nudny ...
vcarel
1
Zdecydowanie nie trzeba pisać funkcji, aby zwrócić prostą
jednowierszową
1
@TimRichardson Nie zgadzam się, ale w momencie pisania tej odpowiedzi nie było alternatywy - Python nie zawierał żadnych tzinfoobiektów, nawet dla UTC.
Mark Ransom
31

Prosta, standardowa biblioteka tylko dla nowoczesnego Pythona. W przeciwieństwie do tego, podaje datę i godzinę uwzględniającą strefę czasową datetime.utcnow(). datetimesbez stref czasowych zdarzają się wypadki.

from datetime import datetime,timezone
now_utc = datetime.now(timezone.utc)
Tim Richardson
źródło
5
Zgodnie z dokumentacją Pythona 3 jest to zalecany sposób.
roskakori
Czysto i łatwo! Powinien być preferowanym sposobem.
Marry35
21
import datetime
import pytz

# datetime object with timezone awareness:
datetime.datetime.now(tz=pytz.utc)

# seconds from epoch:
datetime.datetime.now(tz=pytz.utc).timestamp() 

# ms from epoch:
int(datetime.datetime.now(tz=pytz.utc).timestamp() * 1000) 
MikeL
źródło
10

Z datetime.datetime można już eksportować do znaczników czasu metodą strftime. Zgodnie z przykładem funkcji:

import datetime
def UtcNow():
    now = datetime.datetime.utcnow()
    return int(now.strftime("%s"))

Jeśli chcesz mikrosekund, musisz zmienić ciąg eksportu i rzutować na zmiennoprzecinkowy: return float(now.strftime("%s.%f"))

hectorcanto
źródło
Jaki jest sens konwertowania na ciąg znaków, a następnie z powrotem na liczbę, skoro można uzyskać liczbę bezpośrednio?
Mark Ransom
Chodzi o to, że możesz chcieć zmienić rzeczy w funkcji iz tego powodu lepiej trzymać się obiektu datetime, nie używać time.time(), możesz również użyć time.mktime (now.timetuple ()), aby przekonwertować bezpośrednio na int. W każdym razie w tym prostym przypadku time.time()jest to również ważna opcja. To, co wydaje mi się dziwne, to bieganie przez timedelta, aby znaleźć sekundy.
hectorcanto
Uwaga: strftime("%s")jest to zależne od platformy i nie działa w systemie Windows. (Przynajmniej nie dla mnie na Windows 10).
Julian Kirsch
8

Świadomość strefy czasowej bez zewnętrznych zależności:

from datetime import datetime, timezone

def utc_now():
    return datetime.utcnow().replace(tzinfo=timezone.utc)
Cesar Canassa
źródło
-4

W Pythonie 3 używając wyrażenia lambda, wypróbuj;

from datetime import datetime
utc_now = lambda : datetime.utcnow()

i wywołaj funkcję normalnie;

print(utc_now())
STREET MONEY
źródło
2
bądźcie mili teraz dzieci; ^)
Demis