Convertendo o tempo da época na data e hora

303

Estou recebendo uma resposta do resto. É um formato de época da época, como

start_time = 1234566
end_time = 1234578

Eu quero converter os segundos da época no formato MySQL para que eu possa armazenar as diferenças no meu banco de dados MySQL.

Eu tentei:

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

O resultado acima não é o que estou esperando. Eu quero que seja assim

2012-09-12 21:00:00

Por favor, sugira como posso conseguir isso?

Além disso, por que estou recebendo TypeError: a float is requiredpara

>>> getbbb_class.end_time = 1347516459425
>>> mend = time.gmtime(getbbb_class.end_time).tm_hour
Traceback (most recent call last):
  ...
TypeError: a float is required
user1667633
fonte
Você tem certeza 1347516459425? Esta não é uma época válida. Tente time.gmtime(float(str(i)[:-6]+'.'+str(i)[-6:]))onde iestá 1347516459425.
Burhan Khalid
@ Burhan Como você descobriu que essa não é uma época válida?
User1667633
2
Porque uma época está apenas na faixa de ~ 10¹⁰. Tente usar time.ctime (1347516459.425), para obter 13 de setembro de 2012. Cuidado com o decimal.
Pax Vobiscum
7
Por favor, pare de chamá-lo de "época da época" quando você quer dizer Hora do Unix . Houve muitas épocas diferentes usadas na computação .
Matt Johnson-Pint
Eu costumava tirar época = unix = posix ... obrigado por apontar isso.
Ben

Respostas:

354

Para converter seu valor de tempo (float ou int) em uma string formatada, use:

time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(1347517370))
ron rothman
fonte
3
time.strftime ('% Y-% m-% d% H:% M:% S', time.localtime (1347517491247)) '44671-02-17 11:44:07' por que?
User1667633
3
De onde veio o tempo "1347517491247" no seu exemplo? Você está usando um valor em tempo real?
ron Rothman
Na verdade, eu estou recebendo o valor do servidor BigBlueButton
user1667633
20
time.strftime ('% Y-% m-% d% H:% M:% S', time.localtime (1347517491.247)) '2012-09-13 08:24:51' Seu valor é época em ms
MatthieuW
1
veja docs.python.org/2/library/time.html#time.strftime para mais informações no formato de string
Georg
221

Você também pode usar datetime:

>>> import datetime
>>> datetime.datetime.fromtimestamp(1347517370).strftime('%c')
  '2012-09-13 02:22:50'
png
fonte
3
em que fuso horário isso se converte, e se eu quiser estar em um fuso horário específico. ?
garg10may
4
@ garg10pode o tempo da época ser sempre o deslocamento 0 do UTC, portanto a sequência também seria o deslocamento 0 do UTC. Isso é equivalente ao fuso horário do Zulu (+00: 00). Você pode ler mais aqui: timeanddate.com/time/zones/z
Devnetics
6
Não é função 'utcfromtimestamp' para obter hora UTC em Python 3.
vwvolodya
A vantagem de usar esta resposta é que a versão datetime strftime()suporta mais espaços reservados de formatação, particularmente% f para a partição de microssegundos da hora. Por razões desconhecidas, time.strftime()não suporta isso, embora os microssegundos possam ser representados no valor flutuante que é inserido 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

Para obter o UTC:

>>> datetime.datetime.utcfromtimestamp(1347517370).strftime('%Y-%m-%d %H:%M:%S')
  '2012-09-13 06:22:50'
user799188
fonte
doc diz que prefere o antigo
qrtLs 14/04
14

Isto é o que você precisa

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'

Por favor, insira um ao floatinvés de um inte esse outro TypeErrordeve desaparecer.

mend = time.gmtime(float(getbbb_class.end_time)).tm_hour
ronak
fonte
10

Tente o seguinte:

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

Também no MySQL, você pode FROM_UNIXTIMEgostar:

INSERT INTO tblname VALUES (FROM_UNIXTIME(1347517119))

Para sua segunda pergunta, provavelmente getbbb_class.end_timeé porque é uma string. Você pode convertê-lo para numérico como:float(getbbb_class.end_time)

dkamins
fonte
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)

Isso é um pouco mais prolixo, mas vem do comando date no unix.

user2899300
fonte
3

Primeiro um pouco de informação na época de 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).

para entender como a época deve ser.

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

apenas verifique se o argumento para o qual você está passando time.gmtime()é inteiro.

tuxuday
fonte