303

我必须在 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

是否有为我进行时间戳转换的模块或函数?

4

12 回答 12

353

另一种方法是使用calendar.timegm

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

它也比%sflag to更便携strftime(在 Windows 上不起作用)。

于 2010-05-05T18:56:46.017 回答
161

现在在 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
于 2013-04-09T18:57:12.633 回答
143

刚找到这个,而且更短。

import time
def expires():
    '''return a UNIX style timestamp representing 5 minutes from now'''
    return int(time.time()+300)
于 2010-05-05T20:06:34.427 回答
57

这就是你需要的:

import time
import datetime
n = datetime.datetime.now()
unix_time = time.mktime(n.timetuple())
于 2013-04-30T19:18:01.590 回答
49

您可以使用格式字符串datetime.strftime以 Epoch 形式获取时间:%s

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

注意:这仅适用于 linux,并且此方法不适用于时区。

于 2010-05-05T18:51:26.110 回答
11

这是一个基于较少破坏datetime的解决方案,用于从 datetime 对象转换为 posix 时间戳:

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

在 Python 中将 datetime.date 转换为 UTC 时间戳查看更多详细信息。

于 2012-11-16T20:26:02.713 回答
6
def in_unix(input):
  start = datetime.datetime(year=1970,month=1,day=1)
  diff = input - start
  return diff.total_seconds()
于 2012-08-17T17:51:25.583 回答
4

以下内容基于上述答案(加上毫秒的更正),并datetime.timestamp()在使用时区时模拟 3.3 之前的 Python 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_timestampsimple-date的一部分。但是,如果您使用的是该软件包,您可能会键入:

SimpleDate(my_datetime).timestamp + 5 * 60

它为 my_datetime 处理更多格式/类型。

于 2013-06-19T03:08:54.797 回答
4

关键是在开始转换之前确保您使用的所有日期都在 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
于 2012-04-06T20:22:35.353 回答
1
def expiration_time():
    import datetime,calendar
    timestamp = calendar.timegm(datetime.datetime.now().timetuple())
    returnValue = datetime.timedelta(minutes=5).total_seconds() + timestamp
    return returnValue
于 2012-11-16T20:39:42.110 回答
1

请注意,timedelta.total_seconds()适用于 python-2.7+ 的解决方案。用于calendar.timegm(future.utctimetuple())较低版本的 Python。

于 2013-09-26T17:12:11.297 回答
0

这种使用内置时间戳功能的方法怎么样?该片段适用于不同的时间(不仅仅是当前时间)。

import datetime

a = "2017-01-01 14:30:00"
b = datetime.datetime.strptime(a, '%Y-%m-%d %H:%M:%S')
c = int(b.timestamp()/60.0)
alarm_time = c + 5

运行环境操作系统:Ubuntu 16.04 Python 3.6

于 2021-11-12T00:27:55.797 回答