Conversion du temps Epoch en datetime

303

Je reçois une réponse du reste est un format de temps Epoch comme

start_time = 1234566
end_time = 1234578

Je veux convertir cette époque en secondes au format MySQL afin de pouvoir stocker les différences dans ma base de données MySQL.

J'ai essayé:

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

Le résultat ci-dessus n'est pas ce que j'attends. Je veux que ce soit comme

2012-09-12 21:00:00

Veuillez suggérer comment puis-je y parvenir?

Aussi, pourquoi je reçois TypeError: a float is requiredpour

>>> 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
la source
Êtes-vous sûr 1347516459425? Ce n'est pas une époque valide. Essayez time.gmtime(float(str(i)[:-6]+'.'+str(i)[-6:]))iest 1347516459425.
Burhan Khalid
@Burhan Comment avez-vous découvert que ce n'était pas une époque valide?
user1667633
2
Parce qu'une époque n'est que de l'ordre de ~ 10¹⁰. Essayez d'utiliser time.ctime (1347516459.425), cela vous donnera le 13 septembre 12. Attention à la décimale.
Pax Vobiscum
7
S'il vous plaît, arrêtez de l'appeler "epoch time" lorsque vous voulez dire Unix Time . Il y a eu de nombreuses époques différentes utilisées en informatique .
Matt Johnson-Pint
J'avais l'habitude de prendre epoch = unix = posix ... merci de l'avoir signalé.
Ben

Réponses:

354

Pour convertir votre valeur de temps (float ou int) en une chaîne formatée, utilisez:

time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(1347517370))
ron rothman
la source
3
time.strftime ('% Y-% m-% d% H:% M:% S', time.localtime (1347517491247)) '44671-02-17 11:44:07' pourquoi?
user1667633
3
D'où vient le temps "1347517491247" dans votre exemple? Est-ce une valeur en temps réel que vous utilisez?
ron rothman
en fait, je reçois cette valeur du serveur
bigbluebutton
20
time.strftime ('% Y-% m-% d% H:% M:% S', time.localtime (1347517491.247)) '2012-09-13 08:24:51' Votre valeur est epoch en ms
MatthieuW
1
voir docs.python.org/2/library/time.html#time.strftime pour plus d'informations dans la chaîne de format
georg
221

Vous pouvez également utiliser datetime:

>>> import datetime
>>> datetime.datetime.fromtimestamp(1347517370).strftime('%c')
  '2012-09-13 02:22:50'
png
la source
3
dans quel fuseau horaire effectue cette conversion, et si je veux être dans un fuseau horaire spécifique. ?
garg10mai
4
@ garg10may epoch time est toujours UTC offset 0, donc la chaîne serait également UTC offset 0. Ceci est équivalent au fuseau horaire zoulou (+00: 00). Vous pouvez en savoir plus ici: timeanddate.com/time/zones/z
Devnetics
6
Il y a la fonction 'utcfromtimestamp' pour obtenir l'heure UTC en python 3.
vwvolodya
L'avantage de l'utilisation de cette réponse est que la version datetime strftime()prend en charge plus d'espaces réservés de formatage, en particulier% f pour la partie microsecondes de l'heure. Pour des raisons inconnues, time.strftime()ne prend pas en charge cela, bien que les microsecondes puissent être représentées dans la valeur flottante entrée dans 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

Pour obtenir UTC:

>>> datetime.datetime.utcfromtimestamp(1347517370).strftime('%Y-%m-%d %H:%M:%S')
  '2012-09-13 06:22:50'
user799188
la source
doc dit qu'il préfère l'ancien
qrtLs
14

Voilà ce dont vous avez besoin

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'

Veuillez saisir un floatau lieu d'un intet cet autre TypeErrordevrait disparaître.

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

Essaye ça:

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

Toujours dans MySQL, vous pouvez FROM_UNIXTIMEaimer:

INSERT INTO tblname VALUES (FROM_UNIXTIME(1347517119))

Pour votre 2ème question, c'est probablement parce que getbbb_class.end_timec'est une chaîne. Vous pouvez le convertir en numérique comme:float(getbbb_class.end_time)

dkamins
la source
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)

C'est un peu plus verbeux mais cela vient de la commande date sous unix.

user2899300
la source
3

D'abord un peu d'informations à l'époque 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).

pour comprendre comment l'époque devrait être.

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

assurez-vous simplement que l'argument vers lequel vous passez time.gmtime()est entier.

tuxuday
la source