Je dois créer une valeur "Expires" 5 minutes plus tard, mais je dois la fournir au format UNIX Timestamp. J'ai ceci jusqu'à présent, mais cela ressemble à un bidouillage.
def expires():
'''return a UNIX style timestamp representing 5 minutes from now'''
Epoch = datetime.datetime(1970, 1, 1)
seconds_in_a_day = 60 * 60 * 24
five_minutes = datetime.timedelta(seconds=5*60)
five_minutes_from_now = datetime.datetime.now() + five_minutes
since_Epoch = five_minutes_from_now - Epoch
return since_Epoch.days * seconds_in_a_day + since_Epoch.seconds
Existe-t-il un module ou une fonction qui effectue la conversion d’horodatage pour moi?
Je viens de trouver cela, et c'est encore plus court.
import time
def expires():
'''return a UNIX style timestamp representing 5 minutes from now'''
return int(time.time()+300)
Une autre méthode consiste à utiliser calendar.timegm
:
_future = datetime.datetime.utcnow() + datetime.timedelta(minutes=5)
return calendar.timegm(future.timetuple())
_
Il est également plus portable que l'indicateur _%s
_ sur strftime
(qui ne fonctionne pas sous Windows).
Maintenant dans Python> = 3.3 vous pouvez simplement appeler la méthode timestamp () pour obtenir l'horodatage comme un flotteur.
import datetime
current_time = datetime.datetime.now(datetime.timezone.utc)
unix_timestamp = current_time.timestamp() # works if Python >= 3.3
unix_timestamp_plus_5_min = unix_timestamp + (5 * 60) # 5 min * 60 seconds
Voici ce dont vous avez besoin:
import time
import datetime
n = datetime.datetime.now()
unix_time = time.mktime(n.timetuple())
Vous pouvez utiliser datetime.strftime
pour obtenir l'heure sous forme d'époque, en utilisant la chaîne de format %s
:
def expires():
future = datetime.datetime.now() + datetime.timedelta(seconds=5*60)
return int(future.strftime("%s"))
Voici une solution moins cassée basée sur datetime
- pour convertir un objet datetime en un horodatage posix:
future = datetime.datetime.utcnow() + datetime.timedelta(minutes=5)
return (future - datetime.datetime(1970, 1, 1)).total_seconds()
Voir plus de détails à la page Conversion de datetime.date en horodatage UTC en Python .
def in_unix(input):
start = datetime.datetime(year=1970,month=1,day=1)
diff = input - start
return diff.total_seconds()
La clé est de vous assurer que toutes les dates que vous utilisez sont dans le fuseau horaire utc avant de commencer la conversion. Voir http://pytz.sourceforge.net/ pour apprendre à le faire correctement. En normalisant à utc, vous éliminez l'ambiguïté des transitions à l'heure d'été. Ensuite, vous pouvez utiliser timedelta en toute sécurité pour calculer la distance par rapport à l'époque unix, puis convertir en secondes ou en millisecondes.
Notez que l’horodatage Unix résultant est lui-même dans le fuseau horaire UTC. Si vous souhaitez voir l'horodatage dans un fuseau horaire localisé, vous devrez effectuer une autre conversion.
Notez également que cela ne fonctionnera que pour des dates postérieures à 1970.
import datetime
import pytz
UNIX_Epoch = datetime.datetime(1970, 1, 1, 0, 0, tzinfo = pytz.utc)
def Epoch(utc_datetime):
delta = utc_datetime - UNIX_Epoch
seconds = delta.total_seconds()
ms = seconds * 1000
return ms
Ce qui suit est basé sur les réponses ci-dessus (plus une correction pour les millisecondes) et émule datetime.timestamp()
pour Python 3 avant 3.3 lorsque les fuseaux horaires sont utilisés.
def datetime_timestamp(datetime):
'''
Equivalent to datetime.timestamp() for pre-3.3
'''
try:
return datetime.timestamp()
except AttributeError:
utc_datetime = datetime.astimezone(utc)
return timegm(utc_datetime.timetuple()) + utc_datetime.microsecond / 1e6
Pour répondre strictement à la question telle que posée, vous souhaitez:
datetime_timestamp(my_datetime) + 5 * 60
datetime_timestamp
fait partie de simple-date . Mais si vous utilisiez ce paquet, vous taperiez probablement:
SimpleDate(my_datetime).timestamp + 5 * 60
qui gère beaucoup plus de formats/types pour my_datetime.
Notez que les solutions avec timedelta.total_seconds()
fonctionnent sur python-2.7 +. Utilisez calendar.timegm(future.utctimetuple())
pour les versions inférieures de Python.
def expiration_time():
import datetime,calendar
timestamp = calendar.timegm(datetime.datetime.now().timetuple())
returnValue = datetime.timedelta(minutes=5).total_seconds() + timestamp
return returnValue