Python将来五分钟创建unix时间戳


297

我必须在将来的5分钟内创建一个“ Expires”值,但是我必须以UNIX Timestamp格式提供它。到目前为止,我已经掌握了这个功能,但似乎有点。

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

是否有为我转换时间戳的模块或功能?


7
我建议更改此问题的主题。这个问题很好,但这不是关于将日期时间转换为Unix时间戳。它是关于如何在将来的5分钟内获得Unix时间戳。
DA

我不同意,@ DA问题本质上说:“我需要做X和Y。这就是我现在所拥有的。做Y的更好方法是什么?” 也许有更好的方法可以做X,但是标题和正文显然会问到Y。–
Rob Kennedy

6
我完全同意您的问题,我认为这是一个很好的答案。问题是“ Python日期时间到Unix时间戳”不能反映问题或答案。我发现这篇文章正在寻找一种进行转换的方法,由于主题行的误导,我浪费了时间。我建议:“ Python,将来将是UNIX Timestamp的5分钟”
DA

3
@JimmyKane -关于如何从一个日期时间的时间戳一个非常全面的答案可以在这里找到: stackoverflow.com/questions/8777753/...
蒂姆·蒂斯代尔

@TimTisdall是的,因为标题更改了,所以没有意义
Jimmy Kane

Answers:


349

另一种方法是使用calendar.timegm

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

它比%s标记为strftime(在Windows上不起作用)更可移植。


谢谢D.Shawley。help(datetime.timedelta)没有提到该快捷方式。它只有几天,几秒钟和几微秒。
丹尼尔·罗登

12
请注意,结合前两个注释,正确的解决方案是:calendar.timegm(future.utctimetuple())。这样可确保将UTC时间传递到中calendar.timegm
shadowmatter

1
无法足够@tumbleweed的评论。如果要获取UNIX时间戳(因此是UTC时间戳),请使用calendar.timegm。
Bialecki

@风滚草,对。如果您使用mktime,则gmtime(0)会导致除UTC以外的任何时区的非往返往返增量为非零值:例如`time.mktime(datetime.fromtimestamp(time.mktime(time.gmtime(0))。timetuple())`)给出21600.0了我的Unix机器的TZ的秒(6小时)而不是0.0的信息
滚刀

如果您想获取UTC时间戳,则应使用:calendar.timegm(datetime.datetime.utcnow().timetuple())。使用方法datetime.datetime.now().utctimetuple()对我不起作用(Python 3.2)。
Wookie88 2013年

155

现在,在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

4
为此+1。它应该显示在更高的位置,因为这是在Python 3中执行此操作的简洁方法
ViktorStískala'13

2
@ scott654我认为注释开头的内容很清楚,但我也添加了一些粗体。
Tim Tisdall

1
我会将注释作为代码块中的注释,因为我们所有人都只会首先扫描答案中的代码,并且只有在代码看起来不错时才阅读其余内容。很好的答案。
马修·珀顿

2
当地时间可能模棱两可。示例(datetime.now())很糟糕,因为它鼓励使用代表本地时间的简单日期时间对象,并且在DST转换期间可能会失败(由于内在的歧义)。您可以ts = datetime.now(timezone.utc).timestamp()改用。
2013年

@JFSebastian-好点。不过,我不想添加到导入中,因此将其更改为utcnow()。我曾经在时区设置为UTC的机器上工作,但是在此代码段中不应假定这种情况。
Tim Tisdall

139

刚发现,它甚至更短。

import time
def expires():
    '''return a UNIX style timestamp representing 5 minutes from now'''
    return int(time.time()+300)

12
这不能回答问题。
Jesse Dhillon'4

22
@JesseDhillon它回答了这个问题(在未来5分钟内设置UNIX时间戳),只是没有标题。
dbr

3
time.time()可以退后。要在未来5分钟内创建一个“ Expires”值,您可能需要 time.monotonic()根据用例进行模拟。
2012年

@ jf-sebastian time.monotonic()不返回UNIX时间戳,它返回带有未定义参考点的时间戳。
rspeer 2013年

@rspeer:是的,正如文档所说,只有连续调用之间的区别才有效。是否monotonic可以使用取决于您的用例,例如,subprocess模块确实使用它来实现timeout选项。
jfs

57

这是您需要的:

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

这与提供的“ Cat Plus Plus”有何不同?
大卫,

3
例如,这是对“ Python日期时间到Unix时间戳”的回答,而Cat Plus Plus回答了“ Python日期时间到Unix时间戳将在5分钟之内”的问题。因此,这是干净明显的。
running.t 2013年

@ running.t:它提醒我:“每个问题都有简单,明显和错误的解决方案”。查看有关的可能问题mktime(dt.timetuple())datetime.now(timezone.utc).timestamp()@Tim Tisdall提供的是Python 3.3+中的解决方案。否则(dt - epoch).total_seconds()可以使用
jfs

@JFSebastian如果我真的希望所有计算都在本地时间进行怎么办?例如是这种情况。解析一个已知的本地时间的天真字符串,并确定在该特定时间是否存在DST?
n611x007 2014年

1
@naxa:是的,一些当地时间不明确或不存在。同样,由于DST以外的原因,时区偏移可能会有所不同(您需要tz数据库(例如pytz)才能找到正确的偏移)。当地时间意味着当地政客认为衡量时间即一个好主意,即可能非常不规律。
jfs

48

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

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

注意:此方法仅在linux下有效,而此方法不适用于时区。


32
这是某种未记录的行为(python.org/doc/current/library/datetime.html)。似乎可以在linux下运行,而不能在win32下运行(生​​成ValueError: Invalid format string)。
安东尼·哈奇金斯

3
此方法不适用于时区。更改时区将得出相同的结果datetime(2013,12,7,tzinfo = timezone(“ America / Chicago”))。strftime(“%s”)1386385200 datetime(2013,12,7,tzinfo = timezone(“ Europe /里加“))。strftime(”%s“)1386385200
Martins Balodis

11

这是一个datetime从日期时间对象转换为posix时间戳记的基于基础的解决方案:

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

在Python中将datetime.date转换为UTC时间戳,请参见更多详细信息。


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

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

3
注意:我不了解“本地时区中的[unix]时间戳”。时间戳是相同的(自以来经过的秒数1970-01-01 00:00:00+00:00)。要获取本地时区的原始日期时间对象:datetime.fromtimestamp(ts)
jfs 2012年

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处理更多格式/类型。


您不应该加上(5 * 60)来增加5分钟吗?我认为只加5只会使时间戳增加5秒。
Tim Tisdall

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

1

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.