Python在未来五分钟创建unix时间戳

Posted

技术标签:

【中文标题】Python在未来五分钟创建unix时间戳【英文标题】:Python Create unix timestamp five minutes in the future 【发布时间】:2011-02-16 01:55:14 【问题描述】:

我必须在 5 分钟后创建一个“过期”值,但我必须以 UNIX 时间戳格式提供它。到目前为止我有这个,但它似乎是一个 hack。

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

有没有为我做时间戳转换的模块或函数?

【问题讨论】:

我建议改变这个问题的主题。这个问题很好,但不是关于将日期时间转换为 Unix 时间戳。它是关于如何在未来 5 分钟得到一个 Unix 时间戳。 我不同意,@D.A.这个问题本质上是说“我需要做 X 和 Y。这就是我现在所拥有的。做 Y 的更好方法是什么?”也许有更好的方法来做 X,但标题和正文明确询问了 Y。 我完全同意你的问题,我认为这是一个很好的答案。问题是“Python 日期时间到 Unix 时间戳”既不能反映问题,也不能反映答案。我发现这篇文章正在寻找一种进行转换的方法,但由于误导性的主题行,我浪费了时间。我建议:“Python,未来 5 分钟作为 UNIX 时间戳” @JimmyKane - 关于如何从日期时间获取时间戳的非常全面的答案可以在这里找到:***.com/questions/8777753/… @TimTisdall 是的,因为标题已更改,所以没有意义 【参考方案1】:

另一种方式是使用calendar.timegm:

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

它也比 %s 标志到 strftime 更便携(在 Windows 上不起作用)。

【讨论】:

谢谢 D.Shawley。 help(datetime.timedelta) 没有提到那个快捷方式。它只有天、秒和微秒。 请注意,结合前面两个 cmets,正确的解决方案是:calendar.timegm(future.utctimetuple())。这可确保将 UTC 时间传递到 calendar.timegm 对@tumbleweed 的评论赞不绝口。如果您尝试获取 UNIX 时间戳(因此是 UTC 时间戳),请使用 calendar.timegm。 @tumbleweed,对。如果您使用 mktime 加上 gmtime(0) 将导致除 UTC 之外的任何时区的非零往返增量:例如`time.mktime(datetime.fromtimestamp(time.mktime(time.gmtime(0))).timetuple())` 为我的 unix 机器的 TZ 提供 21600.0 秒(6 小时)而不是 0.0 如果你想获得 UTC 时间戳,你应该使用这个:calendar.timegm(datetime.datetime.utcnow().timetuple())。使用datetime.datetime.now().utctimetuple() 的方法对我不起作用(Python 3.2)。【参考方案2】:

现在在 Python >= 3.3 中,您只需调用 timestamp() method 即可将时间戳记为浮点数。

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

【讨论】:

为此 +1。它应该显示得更高,因为这是在 Python 3 中做到这一点的简洁方式 @scott654 我认为把它放在评论的开头就足够清楚了,但我也加了一些粗体。 我会将注释作为代码块中的注释,因为我们都只是先扫描答案中的代码,然后只有在代码看起来不错时才阅读其余部分。不过答案很好。 local time may be ambigous。示例 (datetime.now()) 很糟糕,因为它鼓励使用表示本地时间的原始日期时间对象,并且在 DST 转换期间它可能会失败(由于固有的歧义)。你可以改用ts = datetime.now(timezone.utc).timestamp() @J.F.Sebastian - 好点。不过,我不想添加到导入中,所以我将其更改为 utcnow()。我习惯于在时区设置为 UTC 的机器上工作,但这不应该在这段代码 sn-p 中假设。【参考方案3】:

刚刚找到这个,而且更短。

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

【讨论】:

这不能回答问题。 @JesseDhillon 它回答了这个问题(在未来 5 分钟内制作一个 UNIX 时间戳),而不是标题。 time.time() 可以重新设置。要在 5 分钟后创建“过期”值,您可能需要 time.monotonic() 模拟,具体取决于您的用例。 @j-f-sebastian time.monotonic() 不返回 UNIX 时间戳,它返回带有未定义参考点的时间戳。 @rspeer:是的,作为the docs say,只有连续调用之间的差异有效。是否可以使用 monotonic 取决于您的用例,例如,subprocess 模块确实使用它来实现 timeout 选项。【参考方案4】:

这是你需要的:

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

【讨论】:

与提供的“Cat Plus Plus”有何不同或增加? 例如这是问题“Python 日期时间到 Unix 时间戳”的答案,而 Cat Plus Plus 回答了问题“Python 日期时间将在 5 分钟内到 Unix 时间戳”。所以这个很干净,很明显。 @running.t:它提醒我:“每个问题都有简单、明显和错误的解决方案”。见possible issues with mktime(dt.timetuple())。 @Tim Tisdall 提供的 datetime.now(timezone.utc).timestamp() 是 Python 3.3+ 中的解决方案。否则(dt - epoch).total_seconds() could be used. @J.F.Sebastian 如果我真的希望所有计算都在当地时间发生怎么办?例如,情况是否如此。解析一个知道是本地时间的幼稚字符串并确定在该特定时间是否存在有效的 DST? @naxa:是的,有些当地时间是不明确的或不存在的。此外,由于 DST 以外的原因,时区偏移量可能会有所不同(您需要一个 tz 数据库,例如 pytz,以找出正确的偏移量)。当地时间意味着当地政客认为测量时间的好主意,即它可能非常不规则。【参考方案5】:

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

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

注意: 这只适用于linux下,此方法不适用于时区。

【讨论】:

这是一个有点无证的行为 (python.org/doc/current/library/datetime.html)。似乎在linux下工作,在win32下不工作(生成ValueError: Invalid format string)。 此方法不适用于时区。更改时区将给出相同的结果 datetime(2013,12,7,tzinfo=timezone("America/Chicago")).strftime("%s") 1386385200 datetime(2013,12,7,tzinfo=timezone("Europe/里加")).strftime("%s") 1386385200【参考方案6】:

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

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

在Converting datetime.date to UTC timestamp in Python查看更多详情。

【讨论】:

【参考方案7】:
def in_unix(input):
  start = datetime.datetime(year=1970,month=1,day=1)
  diff = input - start
  return diff.total_seconds()

【讨论】:

【参考方案8】:

关键是在开始转换之前确保您使用的所有日期都在 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

【讨论】:

注意:我不明白“本地化时区中的 [unix] 时间戳”。时间戳相同(自1970-01-01 00:00:00+00:00 以来经过的秒数)。要获取本地时区的原始日期时间对象:datetime.fromtimestamp(ts)【参考方案9】:

以下内容基于上述答案(加上毫秒的更正),并在使用时区时模拟 3.3 之前的 Python 3 的 datetime.timestamp()

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

【讨论】:

不应该加上 (5 * 60) 来增加 5 分钟吗?我认为仅添加 5 只会使时间戳增加 5 秒。【参考方案10】:
def expiration_time():
    import datetime,calendar
    timestamp = calendar.timegm(datetime.datetime.now().timetuple())
    returnValue = datetime.timedelta(minutes=5).total_seconds() + timestamp
    return returnValue

【讨论】:

【参考方案11】:

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

【讨论】:

【参考方案12】:

使用内置时间戳功能的这种方法怎么样? sn-p 的工作时间不同(不仅仅是当前时间)。

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

【讨论】:

以上是关于Python在未来五分钟创建unix时间戳的主要内容,如果未能解决你的问题,请参考以下文章

在python中将UNIX时间戳转换为str并将str转换为UNIX时间戳[重复]

自unix时间戳以来是不是有一种流行的显示时间的方法?

在php中查找2个unix时间戳之间的天数

在 Python 中将 datetime 更改为 Unix 时间戳

如何在 Python 中查找同一小时的第二天 Unix 时间戳,包括 DST?

谷歌表格中日期和小时的Unix时间戳[重复]