2013-04-11 23 views
48

Ho cercato un mucchio su StackExchange per una soluzione, ma niente fa esattamente quello di cui ho bisogno. In JavaScript, sto usando quanto segue per calcolare il tempo UTC dal 1 gennaio 1970:Come ottenere l'ora UTC in Python?

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?

+1

correlati: [Python: Come ottenere un valore di datetime.today() questo è "timezone aware"?] (http://stackoverflow.com/q/4530069/4279) – jfs

risposta

80

provare questo codice che usa datetime.utcnow():

from datetime import datetime 
datetime.utcnow() 

Per i vostri scopi quando è necessario calcolare una quantità di tempo trascorso tra due date tutto quello che serve è quello di sottrarre end e le date di inizio. I risultati di tale sottrazione è un timedelta object.

Dalla documentazione pitone:

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

e questo significa che di default è possibile ottenere uno qualsiasi dei settori di cui in essa di 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 vera abilitata.

21

Nella forma più vicino alla tua originale:

import datetime 

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

Se avete bisogno di sapere il numero di secondi dal 1970-01-01 piuttosto che un Python nativo datetime, utilizzare questo invece:

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

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

utc_now = datetime.datetime.utcnow 
+1

Mi piace la tua risposta meglio di quella con rating più elevato dall'alto. Grazie per la profondità qui. –

+0

@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. –

+7

Forse dovresti considerare di avvolgere UtcNow() in un'altra funzione. È semplicemente troppo semplice Inoltre, non continuare a utilizzare caratteri di sottolineatura. PEP 8 è così noioso ... – vcarel

3

Da datetime.datetime già possibile esportare in timestamp con il metodo strftime. In seguito alla vostra funzione di esempio:

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

Se volete microsecondi, è necessario modificare la stringa di esportazione e gettati a galleggiare come: return float(now.strftime("%s.%f"))

+0

Qual è il punto di conversione in una stringa e quindi di nuovo su un numero quando è possibile ottenere direttamente il numero ? –

+0

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

Problemi correlati