Python Create unix timestamp five minutes in the future
我必须在未来5分钟创建一个"Expires"值,但我必须以UNIX Timestamp格式提供它。 到目前为止,我有这个,但它似乎是一个黑客。
1 2 3 4 5 6 7 8
| 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 |
是否有为我进行时间戳转换的模块或函数?
-
我建议改变这个问题的主题。问题很好,但不是将datetime转换为Unix时间戳。它是关于如何在未来5分钟获得Unix时间戳。
-
我不同意,@ D.A。问题基本上是"我需要做X和Y.这就是我现在所拥有的。做Y的更好的方法是什么?"也许有更好的方法来做X,但标题和身体清楚地询问Y.
-
我完全同意你的看法,我认为这是一个很好的答案。问题是"Python datetime to Unix timestamp"并不反映问题或答案。我发现这篇文章搜索了一种转换方式,由于误导性的主题,我失去了时间。我建议:"Python,将来5分钟作为UNIX时间戳"
-
@JimmyKane - 关于如何从日期时间获取时间戳的相关综合答案可以在这里找到:stackoverflow.com/questions/8777753/…
-
@TimTisdall是的,因为标题被改变了没有意义
另一种方法是使用calendar.timegm:
1 2
| future = datetime.datetime.utcnow() + datetime.timedelta(minutes=5)
return calendar.timegm(future.timetuple()) |
它也比%s标志更便携strftime(在Windows上不起作用)。
-
谢谢D.Shawley。 help(datetime.timedelta)没有提到那个捷径。它只有几天,几秒和几微秒。
-
请注意,结合前两个注释,正确的解决方案是:calendar.timegm(future.utctimetuple())。这可确保将UTC时间传递到calendar.timegm。
-
不能upvote @ tumbleweed的评论。如果您尝试获取UNIX时间戳(因此使用UTC),请使用calendar.timegm。
-
@tumbleweed,对。如果使用mktime plus 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)。
-
@ Wookie88:你可以调用time.time()来获取@Off Rhoden的回答显示的时间戳
-
@CatPlusPlus:不幸的是,禁止可以改变答案含义的编辑,这就是为什么如果答案错误,则使用注释而不是直接修复答案。在我看来,即使所有编辑中有一半是错误的;按下回滚按钮很容易。
-
@ J.F.Sebastian在那里,我做了wiki,随时编辑你心中的内容!我真的不在乎重新研究一个糟糕的答案(如何得到300分超出我,愚蠢的SO投票)到4年前的一个糟糕的SO问题。
-
@shadowmatter:.utctimetuple()不能像你想象的那样工作。它不会将本地时区中的天真日期时间对象转换为UTC时间。结果与.timetuple()相同,只有tm_isdst被强制为零。
-
你可以做future.strftime("%s")
-
@NidhinBoseJ。:就像你没有真正阅读答案一样。这也是一个愚蠢的解决方案,因为你最终得到一个字符串。你为什么想要一个字符串?提示:你没有。
现在在Python> = 3.3中,您可以调用timestamp()方法将时间戳作为浮点数。
1 2 3 4 5
| 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我认为在评论开头就把它弄得很清楚,但我也加了一些大胆的内容。
-
我将注释作为代码块中的注释,因为我们只是首先扫描答案中的代码,如果代码看起来很好,则只读取其余部分。但是答案很好。
-
当地时间可能很暧昧。示例(datetime.now())很糟糕,因为它鼓励使用表示本地时间的天真日期时间对象,并且在DST转换期间可能会失败(由于固有的模糊性)。您可以改用ts = datetime.now(timezone.utc).timestamp()。
-
@ J.F.Sebastian - 好点。我不想添加到导入,所以我将其更改为utcnow()。我习惯于在时区设置为UTC的机器上工作,但不应在此代码段中假设。
-
现在代码不同于任何不同于utc的本地时间。 .timestamp()将本地时间用于天真的日期时间对象。 timezone.utc在这里是必要的。查看从datetime获取时间戳的更多方法
-
@ J.F.Sebastian - 好的,改为now(datetime.timezone.utc)
-
+1:看起来不错。您可以使用from datetime import datetime, timezone来提高可读性
-
这给出了一个小数点的输出虽然不正确吗?例如。 <5233>
-
@geoidesic - 没错,它将时间戳作为浮点数返回。有些机器返回毫秒精度而其他机器没有,所以这个方法总是返回一个浮点数来容纳两者。如果需要,您可以将值放入int()以将其截断为整数。
刚发现这个,它甚至更短。
1 2 3 4
| import time
def expires():
'''return a UNIX style timestamp representing 5 minutes from now'''
return int(time.time()+300) |
-
这不回答这个问题。
-
@JesseDhillon它回答了这个问题(将来的UNIX时间戳为5分钟),而不是标题。
-
time.time()可以退回。要在将来5分钟创建"过期"值,您可能需要time.monotonic()模拟,具体取决于您的用例。
-
@ j-f-sebastian time.monotonic()不返回UNIX时间戳,它返回带有未定义引用点的时间戳。
-
@rspeer:是的,正如文档所说,只有连续调用之间的区别才有效。是否可以使用monotonic取决于您的用例,例如,subprocess模块确实使用它来实现timeout选项。
-
为什么要为此创建一个全新的专用功能?
这就是你需要的:
1 2 3 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:它提醒我:"每个问题都有简单,明显和错误的解决方案"。查看mktime(dt.timetuple())的可能问题。 @Tim Tisdall提供的datetime.now(timezone.utc).timestamp()是Python 3.3+的解决方案。否则可以使用(dt - epoch).total_seconds()。
-
@ J.F.Sebastian如果我真的希望所有计算都在当地时间进行怎么办?是这样的情况,例如。解析一个人知道是本地时间的天真字符串,并确定在该特定时间内是否有DST生效?
-
@naxa:是的,一些当地时间含糊不清或根本不存在。此外,时区偏移可能因DST以外的原因而不同(您需要一个tz数据库,如pytz,以找出正确的偏移量)。当地时间意味着当地政治家认为衡量时间的好主意,即它可能是非常不规则的。
您可以使用datetime.strftime使用%s格式字符串以Epoch格式获取时间:
1 2 3
| def expires():
future = datetime.datetime.now() + datetime.timedelta(seconds=5*60)
return int(future.strftime("%s")) |
-
这是一种有点无证的行为(python.org/doc/current/library/datetime.html)。似乎是在linux下工作而不是在win32下工作(生成ValueError: Invalid format string)。
-
此方法不适用于时区。更改时区将给出相同的结果日期时间(2013,12,7,tzinfo =时区("美国/芝加哥"))。strftime("%s")1386385200 datetime(2013,12,7,tzinfo = timezone("Europe /里加"))。strftime("%s")1386385200
这是一个不太破碎的datetime解决方案,可以从datetime对象转换为posix时间戳:
1 2
| future = datetime.datetime.utcnow() + datetime.timedelta(minutes=5)
return (future - datetime.datetime(1970, 1, 1)).total_seconds() |
有关详细信息,请参阅在Python中将datetime.date转换为UTC时间戳。
1 2 3 4
| def in_unix(input):
start = datetime.datetime(year=1970,month=1,day=1)
diff = input - start
return diff.total_seconds() |
以下是基于上面的答案(加上毫秒的校正),并在3.3时使用时区时模拟Python 3的datetime.timestamp()。
1 2 3 4 5 6 7 8 9
| 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 |
要严格回答问题,您需要:
1
| datetime_timestamp(my_datetime) + 5 * 60 |
datetime_timestamp是简单日期的一部分。但是,如果您使用的是该软件包,则可以键入:
1
| SimpleDate(my_datetime).timestamp + 5 * 60 |
它为my_datetime处理更多格式/类型。
-
你不应该加(5 * 60)加5分钟吗?我认为只添加5只会在时间戳上增加5秒。
-
你是对的 - 会纠正,谢谢。
关键是在开始转换之前确保您使用的所有日期都在utc时区内。请参阅http://pytz.sourceforge.net/以了解如何正确执行此操作。通过标准化为utc,您可以消除夏令时转换的模糊性。然后,您可以安全地使用timedelta来计算与unix时期的距离,然后转换为秒或毫秒。
请注意,生成的unix时间戳本身是UTC时区。如果您希望在本地化时区中查看时间戳,则需要进行另一次转换。
另请注意,这仅适用于1970年以后的日期。
1 2 3 4 5 6 7 8 9
| 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)
请注意,timedelta.total_seconds()的解决方案适用于python-2.7 +。
对于较低版本的Python,请使用calendar.timegm(future.utctimetuple())。
1 2 3 4 5
| def expiration_time():
import datetime,calendar
timestamp = calendar.timegm(datetime.datetime.now().timetuple())
returnValue = datetime.timedelta(minutes=5).total_seconds() + timestamp
return returnValue |