Come ottenere l'ora UTC in Python?


113

Ho cercato una soluzione su StackExchange ma niente fa proprio quello che mi serve. In JavaScript, utilizzo quanto segue per calcolare l'ora UTC dal 1 ° gennaio 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;
}

Quale sarebbe il codice Python equivalente?



Aspetta, stai usando Python o JavaScript?
CheetSheatOverlode

Risposte:


179

Prova questo codice che utilizza datetime.utcnow () :

from datetime import datetime
datetime.utcnow()

Per i tuoi scopi, quando devi calcolare la quantità di tempo trascorso tra due date, tutto ciò di cui hai bisogno è sottrarre le date di fine e di inizio. Il risultato di tale sottrazione è un oggetto timedelta.

Dai documenti di Python:

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

E questo significa che per impostazione predefinita puoi ottenere uno qualsiasi dei campi menzionati nella sua definizione: giorni, secondi, microsecondi, millisecondi, minuti, ore, settimane. Anche l'istanza timedelta ha il metodo total_seconds () che:

Restituisce il numero totale di secondi contenuti nella durata. Equivalente a (td.microseconds + (td.seconds + td.days * 24 * 3600) * 10 * 6) / 10 * 6 calcolato con divisione reale abilitata.


2
forse una brutta sorpresa riguardo datetime.utcnow () è che non restituisce un oggetto sensibile al fuso orario nonostante il nome. Questo è secondo me un grosso problema, motivo per cui preferisco la mia risposta di seguito. Vedere "gli oggetti datetime senza fuso orario dovrebbero essere considerati un" bug "nell'applicazione." julien.danjou.info/python-and-timezones
Tim Richardson

1
Il concetto di un cosiddetto oggetto datetime ingenuo (cioè, nessuna informazione sul fuso orario è impostata) ha uno scopo: voglio che la mia sveglia suoni alle 06:00:00 ogni giorno, non importa dove mi trovo nel mondo. Inoltre permette di "orologi virtuali" nei giochi per computer diciamo: ora sono le 5 del pomeriggio nel mio mondo fantastico. Forzare un fuso orario sull'oggetto datetime sarebbe scomodo, specialmente con l'aritmetica timedelta.
DustByte

42

Nella forma più vicina all'originale:

import datetime

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

Se hai bisogno di conoscere il numero di secondi dal 1970-01-01 piuttosto che un Python nativo datetime, usa questo invece:

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

Python ha convenzioni di denominazione che sono in contrasto con ciò a cui potresti essere abituato in Javascript, vedi PEP 8 . Inoltre, una funzione che restituisce semplicemente il risultato di un'altra funzione è piuttosto sciocca; se si tratta solo di renderlo più accessibile, puoi creare un altro nome per una funzione semplicemente assegnandolo. Il primo esempio sopra potrebbe essere sostituito con:

utc_now = datetime.datetime.utcnow

1
Mi piace la tua risposta meglio di quella con il punteggio più alto dall'alto. Grazie per la profondità qui.
Jordan Dea-Mattson

@Jordan, ripensando alla mia risposta mi rendo conto di aver commesso un errore stilistico inserendo l'importazione all'interno della funzione piuttosto che a livello globale, lo aggiusterò ora.
Mark Ransom

8
Forse dovresti considerare di avvolgere UtcNow () in un'altra funzione. È semplicemente troppo semplice. Inoltre, continua a non usare trattini bassi. PEP 8 è così noioso ...
vcarel

1
Sicuramente non è necessario scrivere una funzione per restituire un semplice one-liner ... datetime.datetime.utcnow ()
cpreid

1
@TimRichardson Non sono in disaccordo, ma al momento in cui è stata scritta questa risposta non c'erano alternative: Python non includeva alcun tzinfooggetto, nemmeno per UTC.
Mark Ransom

31

Semplice libreria standard, solo per python moderno. Fornisce datetime in base al fuso orario, a differenza di datetime.utcnow(). datetimessenza fusi orari sono incidenti in attesa di accadere.

from datetime import datetime,timezone
now_utc = datetime.now(timezone.utc)

5
Secondo la documentazione di Python 3, questo è il modo consigliato per farlo.
roskakori

Pulito e facile! Dovrebbe essere il modo preferito.
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) 

10

Da datetime.datetime è già possibile esportare in timestamp con il metodo strftime. Seguendo il tuo esempio di funzione:

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

Se vuoi microsecondi, devi cambiare la stringa di esportazione e lanciare in modo che fluttui come: return float(now.strftime("%s.%f"))


Qual è lo scopo di convertire in una stringa e poi di nuovo in un numero quando puoi ottenere il numero direttamente?
Mark Ransom

Il punto è che potresti voler cambiare le cose sulla funzione e per questo motivo è meglio attenersi all'oggetto datetime, non usando time.time(), Potresti anche usare time.mktime (now.timetuple ()) per convertire direttamente in int. Comunque, anche per questo semplice caso time.time()è un'opzione valida. Quello che trovo strano, sta andando da timedelta per trovare i secondi.
hectorcanto

Nota che strftime("%s")dipende dalla piattaforma e non funziona su Windows. (Almeno non per me su Windows 10).
Julian Kirsch

8

Riconoscimento del fuso orario con zero dipendenze esterne:

from datetime import datetime, timezone

def utc_now():
    return datetime.utcnow().replace(tzinfo=timezone.utc)

-4

In Python 3 usando l'espressione lambda, prova;

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

e chiama normalmente la funzione;

print(utc_now())

2
sii gentile adesso ragazzi; ^)
Demis
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.