Conversione del tempo Epoch nel datetime


303

Sto ricevendo una risposta dal resto è un formato temporale di tipo Epoch

start_time = 1234566
end_time = 1234578

Voglio convertire quell'epoca in secondi in formato MySQL in modo da poter memorizzare le differenze nel mio database MySQL.

Provai:

>>> import time
>>> time.gmtime(123456)
time.struct_time(tm_year=1970, tm_mon=1, tm_mday=2, tm_hour=10, tm_min=17, tm_sec=36, tm_wday=4, tm_yday=2, tm_isdst=0)

Il risultato sopra non è quello che mi aspetto. Voglio che sia così

2012-09-12 21:00:00

Per favore, suggerisci come posso raggiungere questo obiettivo?

Inoltre, perché io sono sempre TypeError: a float is requiredper

>>> getbbb_class.end_time = 1347516459425
>>> mend = time.gmtime(getbbb_class.end_time).tm_hour
Traceback (most recent call last):
  ...
TypeError: a float is required

Ne sei sicuro 1347516459425? Questa non è un'epoca valida. Prova time.gmtime(float(str(i)[:-6]+'.'+str(i)[-6:]))dove iè 1347516459425.
Burhan Khalid,

@Burhan Come hai scoperto che questa non è un'epoca valida?
user1667633

2
Perché un'epoca è solo nell'intervallo di ~ 10¹⁰. Prova a usare time.ctime (1347516459.425), questo ti darà il 13 settembre 12. Fai attenzione al decimale.
Pax Vobiscum,

7
Per favore, smetti di chiamarlo "tempo di epoca" quando intendi Unix Time . Ci sono state molte epoche diverse utilizzate nell'informatica .
Matt Johnson-Pint,

Prima usavo epoch = unix = posix ... grazie per averlo sottolineato.
Ben

Risposte:


354

Per convertire il valore temporale (float o int) in una stringa formattata, utilizzare:

time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(1347517370))

3
time.strftime ('% Y-% m-% d% H:% M:% S', time.localtime (1347517491247)) '44671-02-17 11:44:07' perché?
user1667633,

3
Da dove viene il tempo "1347517491247" nel tuo esempio? È un valore in tempo reale che stai utilizzando?
Ron Rothman,

in realtà sto ottenendo quel valore dal server
bigbluebutton

20
time.strftime ('% Y-% m-% d% H:% M:% S', time.localtime (1347517491.247)) '2012-09-13 08:24:51' Il tuo valore è epoca in ms
MatthieuW

1
consultare docs.python.org/2/library/time.html#time.strftime per maggiori informazioni nella stringa di formato
georg,

221

Puoi anche usare datetime:

>>> import datetime
>>> datetime.datetime.fromtimestamp(1347517370).strftime('%c')
  '2012-09-13 02:22:50'

3
in quale fuso orario si converte, e se volessi essere in un fuso orario specifico. ?
garg10may

4
@ garg10may il tempo di epoca è sempre offset UTC 0, quindi la stringa sarebbe anche offset UTC 0. Questo è equivalente al fuso orario Zulu (+00: 00). Puoi leggere di più qui: timeanddate.com/time/zones/z
Devnetics,

6
Esiste la funzione 'utcfromtimestamp' per ottenere l'ora UTC in Python 3.
vwvolodya

Il vantaggio dell'utilizzo di questa risposta è che la versione datetime di strftime()supporta più segnaposti di formattazione, in particolare% f per la partizione di microsecondi del tempo. Per ragioni sconosciute, time.strftime()non lo supporta, sebbene i microsecondi possano essere rappresentati nel valore float a cui viene immesso time.localtime().
Andreas Maier,

60
>>> import datetime
>>> datetime.datetime.fromtimestamp(1347517370).strftime('%Y-%m-%d %H:%M:%S')
'2012-09-13 14:22:50' # Local time

Per ottenere UTC:

>>> datetime.datetime.utcfromtimestamp(1347517370).strftime('%Y-%m-%d %H:%M:%S')
  '2012-09-13 06:22:50'

doc dice che preferisce ex
qrtLs

14

questo è quello di cui hai bisogno

In [1]: time.time()
Out[1]: 1347517739.44904

In [2]: time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime(time.time()))
Out[2]: '2012-09-13 06:31:43'

Inserisci un floatinvece di un inte l'altro TypeErrordovrebbe scomparire.

mend = time.gmtime(float(getbbb_class.end_time)).tm_hour

10

Prova questo:

>>> import time
>>> time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime(1347517119))
'2012-09-12 23:18:39'

Anche in MySQL, puoi FROM_UNIXTIMEapprezzare:

INSERT INTO tblname VALUES (FROM_UNIXTIME(1347517119))

Per la tua seconda domanda, è probabilmente perché getbbb_class.end_timeè una stringa. Puoi convertirlo in numerico come:float(getbbb_class.end_time)


8
#This adds 10 seconds from now.
from datetime import datetime
import commands

date_string_command="date +%s"
utc = commands.getoutput(date_string_command)
a_date=datetime.fromtimestamp(float(int(utc))).strftime('%Y-%m-%d %H:%M:%S')
print('a_date:'+a_date)
utc = int(utc)+10
b_date=datetime.fromtimestamp(float(utc)).strftime('%Y-%m-%d %H:%M:%S')
print('b_date:'+b_date)

Questo è un po 'più prolisso ma viene dal comando date in unix.


3

Prima un po 'di informazioni in epoca di man gmtime

The ctime(), gmtime() and localtime() functions all take an argument of data type time_t which represents calendar  time.   When  inter-
       preted  as  an absolute time value, it represents the number of seconds elapsed since 00:00:00 on January 1, 1970, Coordinated Universal
       Time (UTC).

per capire come dovrebbe essere l'epoca.

>>> time.time()
1347517171.6514659
>>> time.gmtime(time.time())
(2012, 9, 13, 6, 19, 34, 3, 257, 0)

assicurati solo che l'arg che stai passando time.gmtime()sia intero.

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.