Python Создать метку времени Unix через пять минут - PullRequest
295 голосов
/ 05 мая 2010

Я должен создать значение «Истекает» через 5 минут, но я должен предоставить его в формате отметки времени UNIX. У меня пока что есть, но похоже на взлом.

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

Есть ли модуль или функция, которая выполняет преобразование метки времени для меня?

Ответы [ 11 ]

347 голосов
/ 05 мая 2010

Другой способ - использовать calendar.timegm:

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

Он также более переносим, ​​чем флаг %s на strftime (который не работает в Windows).

153 голосов
/ 09 апреля 2013

Теперь в Python> = 3.3 вы можете просто вызвать метод timestamp () , чтобы получить метку времени в виде числа с плавающей запятой.

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
137 голосов
/ 06 мая 2010

Только что нашел это, и это еще короче.

import time
def expires():
    '''return a UNIX style timestamp representing 5 minutes from now'''
    return int(time.time()+300)
57 голосов
/ 30 апреля 2013

Это то, что вам нужно:

import time
import datetime
n = datetime.datetime.now()
unix_time = time.mktime(n.timetuple())
47 голосов
/ 05 мая 2010

Вы можете использовать datetime.strftime, чтобы получить время в форме эпохи, используя строку формата %s:

def expires():
    future = datetime.datetime.now() + datetime.timedelta(seconds=5*60)
    return int(future.strftime("%s"))
11 голосов
/ 17 ноября 2012

Вот менее сломанное решение на основе datetime для преобразования из объекта даты и времени в метку времени posix:

future = datetime.datetime.utcnow() + datetime.timedelta(minutes=5)
return (future - datetime.datetime(1970, 1, 1)).total_seconds()

Подробнее см. Преобразование даты и времени в UTC в Python .

6 голосов
/ 17 августа 2012
def in_unix(input):
  start = datetime.datetime(year=1970,month=1,day=1)
  diff = input - start
  return diff.total_seconds()
4 голосов
/ 19 июня 2013

Нижеследующее основано на ответах выше (плюс поправка на миллисекунды) и эмулирует datetime.timestamp() для Python 3 до 3.3, когда используются часовые пояса.

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

Чтобы ответить на вопрос строго, вы бы хотели:

datetime_timestamp(my_datetime) + 5 * 60

datetime_timestamp является частью simple-date . Но если бы вы использовали этот пакет, вы, вероятно, набрали бы:

SimpleDate(my_datetime).timestamp + 5 * 60

, который обрабатывает много других форматов / типов для my_datetime.

4 голосов
/ 07 апреля 2012

Ключ должен гарантировать, что все даты, которые вы используете, находятся в часовом поясе utc, прежде чем вы начнете конвертировать. См. http://pytz.sourceforge.net/, чтобы узнать, как сделать это правильно. Нормализуя до utc, вы устраняете неоднозначность переходов на летнее время. Затем вы можете безопасно использовать timedelta для расчета расстояния от эпохи Unix, а затем преобразовать в секунды или миллисекунды.

Обратите внимание, что полученная метка времени Unix сама находится в часовом поясе UTC. Если вы хотите увидеть метку времени в локализованном часовом поясе, вам нужно будет выполнить другое преобразование.

Также обратите внимание, что это будет работать только для дат после 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
1 голос
/ 26 сентября 2013

Обратите внимание, что решения с timedelta.total_seconds() работают на python-2.7 +. Используйте calendar.timegm(future.utctimetuple()) для более низких версий Python.

...