web-dev-qa-db-fra.com

Python Créer un horodatage Unix cinq minutes plus tard

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?

295
Daniel Rhoden

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)
137
Daniel Rhoden

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

347
Cat Plus Plus

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
153
Tim Tisdall

Voici ce dont vous avez besoin:

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

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"))
47
mipadi

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 .

11
jfs
def in_unix(input):
  start = datetime.datetime(year=1970,month=1,day=1)
  diff = input - start
  return diff.total_seconds()
6
Sravan

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
4
fawce

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.

4
andrew cooke

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.

1
mighq
def expiration_time():
    import datetime,calendar
    timestamp = calendar.timegm(datetime.datetime.now().timetuple())
    returnValue = datetime.timedelta(minutes=5).total_seconds() + timestamp
    return returnValue
1
hd1