306 votes

Python Créer un timestamp unix cinq minutes dans le futur

Je dois créer une valeur "Expires" 5 minutes dans le futur, mais je dois la fournir au format UNIX Timestamp. J'ai obtenu ceci jusqu'à présent, mais cela semble être un hack.

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 de l'horodatage pour moi ?

7 votes

Je vous recommande de changer le sujet de cette question. La question est bonne, mais il ne s'agit pas de convertir une date en un horodatage Unix. Il s'agit de savoir comment obtenir un horodatage Unix 5 minutes dans le futur.

0 votes

Je ne suis pas d'accord, @D.A. La question dit essentiellement "Je dois faire X et Y. Voici ce que j'ai maintenant. Quelle est la meilleure façon de faire Y ?" Il existe peut-être de meilleures façons de faire X, mais le titre et le corps de la question portent clairement sur Y.

6 votes

Je suis tout à fait d'accord avec vous sur la question, et je pense que c'est une bonne question avec une bonne réponse. Le problème est que "Python datetime to Unix timestamp" ne reflète ni la question ni la réponse. J'ai trouvé cet article en cherchant un moyen de faire la conversion, et j'ai perdu du temps à cause de l'objet trompeur. Je suggère : "Python, 5 minutes dans le futur comme timestamp UNIX"

355voto

Cat Plus Plus Points 53385

Une autre façon est d'utiliser calendar.timegm :

future = datetime.datetime.utcnow() + datetime.timedelta(minutes=5)
return calendar.timegm(future.timetuple())

Il est également plus portable que %s pour strftime (qui ne fonctionne pas sous Windows).

0 votes

Merci D.Shawley. help(datetime.timedelta) ne mentionnait pas ce raccourci. Il n'y avait que les jours, les secondes et les microsecondes.

12 votes

Notez que, en combinant les deux commentaires précédents, la bonne solution est : calendar.timegm(future.utctimetuple()) . Cela permet de s'assurer qu'une heure UTC est transmise dans le fichier calendar.timegm .

1 votes

Je ne peux pas assez encourager le commentaire de @tumbleweed. Si vous essayez d'obtenir un timestamp UNIX (et donc un timestamp en UTC), utilisez calendar.timegm.

166voto

Tim Tisdall Points 3153

Maintenant dans Python >= 3.3 vous pouvez simplement appeler le méthode timestamp() pour obtenir l'horodatage sous forme de flottant.

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

5 votes

+1 pour ça. Il devrait être affiché beaucoup plus haut, car c'est la façon propre de faire cela en Python 3.

3 votes

@scott654 Je pensais que le fait de l'avoir au début du commentaire le rendait suffisamment clair, mais j'y ai ajouté du gras aussi.

1 votes

Je ferais la remarque sous forme de commentaire dans le bloc de code, car nous parcourons tous d'abord le code dans les réponses et ne lisons le reste que si le code semble bon. Bonne réponse cependant.

146voto

Off Rhoden Points 3355

Je viens de trouver ça, 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)

12 votes

Cela ne répond pas à la question.

24 votes

@JesseDhillon il répond à la question (faire un timestamp UNIX 5 mins dans le futur), mais pas au titre.

3 votes

time.time() peut être reculée. Pour créer une valeur "Expire" 5 minutes dans le futur, il vous faudra peut-être time.monotonic() analogique en fonction de votre cas d'utilisation.

57voto

Ali Points 4387

C'est ce dont vous avez besoin :

import time
import datetime
n = datetime.datetime.now()
unix_time = time.mktime(n.timetuple())

0 votes

En quoi est-elle différente ou complémentaire de celle fournie par "Cat Plus Plus" ?

3 votes

Par exemple, ceci est la réponse à la question "Python datetime to Unix timestamp" alors que Cat Plus Plus répondait à la question "Python datetime that will be in 5 minutes to Unix timestamp". Cette réponse est donc claire et évidente.

0 votes

@running.t : ça me rappelle : "tout problème a des aspects simples, évidents et ". mauvais solution". Voir problèmes possibles avec mktime(dt.timetuple()) . datetime.now(timezone.utc).timestamp() fournie par @Tim Tisdall est la solution dans Python 3.3+. Sinon, (dt - epoch).total_seconds() pourrait être utilisé .

49voto

mipadi Points 135410

Vous pouvez utiliser datetime.strftime pour obtenir le temps sous forme d'Epoch, en utilisant la fonction %s chaîne de format :

def expires():
    future = datetime.datetime.now() + datetime.timedelta(seconds=5*60)
    return int(future.strftime("%s"))

Note : Ceci ne fonctionne que sous linux, et cette méthode ne fonctionne pas avec les fuseaux horaires.

32 votes

Il s'agit d'un comportement quelque peu non documenté ( python.org/doc/current/library/datetime.html ). Il semble que cela fonctionne sous linux et ne fonctionne pas sous win32 (génération de ValueError: Invalid format string ).

3 votes

Cette méthode ne fonctionne pas avec les fuseaux horaires. Changer de fuseau horaire donnera le même résultat datetime(2013,12,7,tzinfo=timezone("America/Chicago")).strftime("%s") 1386385200 datetime(2013,12,7,tzinfo=timezone("Europe/Riga")).strftime("%s") 1386385200

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X