Ответ 1
Просто нашел это и еще короче.
import time
def expires():
'''return a UNIX style timestamp representing 5 minutes from now'''
return int(time.time()+300)
Мне нужно создать значение "Expires" в течение 5 минут в будущем, но я должен предоставить его в формате Timestamp 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
Есть ли модуль или функция, которая выполняет преобразование временной метки для меня?
Просто нашел это и еще короче.
import time
def expires():
'''return a UNIX style timestamp representing 5 minutes from now'''
return int(time.time()+300)
Другой способ - использовать calendar.timegm
:
future = datetime.datetime.utcnow() + datetime.timedelta(minutes=5)
return calendar.timegm(future.timetuple())
Он также более переносимый, чем %s
флаг strftime
(который не работает в Windows).
Теперь в 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
Это то, что вам нужно:
import time
import datetime
n = datetime.datetime.now()
unix_time = time.mktime(n.timetuple())
Вы можете использовать datetime.strftime
, чтобы получить время в форме Epoch, используя строку формата %s
:
def expires():
future = datetime.datetime.now() + datetime.timedelta(seconds=5*60)
return int(future.strftime("%s"))
Здесь менее сломанное решение на основе datetime
для преобразования из объекта datetime в временную метку posix:
future = datetime.datetime.utcnow() + datetime.timedelta(minutes=5)
return (future - datetime.datetime(1970, 1, 1)).total_seconds()
Подробнее см. Преобразование datetime.date в метку времени UTC в Python.
def in_unix(input):
start = datetime.datetime(year=1970,month=1,day=1)
diff = input - start
return diff.total_seconds()
Ключ должен гарантировать, что все даты, которые вы используете, находятся в часовом поясе 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
Ниже приведены ответы выше (плюс исправление в миллисекундах) и эмулирует 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.
def expiration_time():
import datetime,calendar
timestamp = calendar.timegm(datetime.datetime.now().timetuple())
returnValue = datetime.timedelta(minutes=5).total_seconds() + timestamp
return returnValue
Обратите внимание, что решения с timedelta.total_seconds()
работают на python-2.7 +.
Используйте calendar.timegm(future.utctimetuple())
для более низких версий Python.