【问题标题】:Write a python script to generate a timestamp ( unix epoch value) each day at a give time编写一个 python 脚本以在给定时间每天生成一个时间戳(unix epoch 值)
【发布时间】:2016-04-05 05:35:54
【问题描述】:

我想编写一个小python,它需要每天在特定时间(例如下午 1 点)生成一个简单的精确时间戳(脚本将每天运行)。我写了这样的东西:

from datetime import datetime
now = datetime.utcnow() # Current time
then = datetime(1970,1,1) # 0 epoch time
ts = now - then
ts = ts.days * 24 * 3600 + ts.seconds
print ts

这很好,但我想通过now 来获取我每天的时间字段。我该怎么做?

【问题讨论】:

  • 我有点不清楚你想做什么。 time_field 是什么?
  • now 是日期和时间。 ts = now - then 是自 then 以来的持续时间...你到底想要什么?
  • 我的最终结果应该是一个时间戳,必须在每天下午 1 点(比如说)生成。由于上面的代码给出了当前时间,我想要一个特定时间的时间戳。
  • time.time() 有什么问题?

标签: python timestamp


【解决方案1】:

你可以使用time.mktime函数:

>>> import datetime
>>> import time
>>> dt = datetime.datetime.today().replace(hour=13, minute=0, second=0, microsecond=0)
>>> print(dt)
2016-04-06 13:00:00
>>> time.mktime(dt.timetuple())
1459944000.0

如果您需要时区感知,请使用时区感知日期时间的utctimetuple 方法和time.gmtime 函数。

(编辑以显示如何为特定时间创建 datetime.datetime)

【讨论】:

  • 时间部分很好,但是脚本需要每天运行,所以我希望从系统中动态提取数据部分
  • @PythonFreak 你想在 13:00 使用“今天”的日期时间吗?
  • @PythonFreak:注意:给定的本地时间可能不明确甚至不存在(例如,在 DST 转换期间)。此外,mktime() 可能在某些平台上对给定日期/时间使用不正确的时区定义(如果mktime() 无法访问给定平台上的历史 tz 数据库,并且取决于脚本运行的时间)。你可以use tzlocal.get_localzone() in a portable code
【解决方案2】:

date shell 中的命令也为我们提供了纪元时间。

date +%s

所以把你的python脚本写成

import subprocess
p = subprocess.Popen(['date', '+%s'], stdout=subprocess.PIPE,stderr=subprocess.PIPE)
out, err = p.communicate()
print out

然后用你现在使用的相同逻辑每天调用它。

【讨论】:

  • 哪个外壳?哪个操作系统?
  • date +%s 给我当前数据,我想要特定时间的数据,阅读问题
  • 您可以随时运行它,就像您在上午 8 点运行它一样,但您需要下午 1 点的纪元? @PythonFreak
【解决方案3】:

要生成对应于1pm 的 POSIX 时间戳:

#!/usr/bin/env python3
from datetime import datetime
import tzlocal # $ pip install tzlocal

local_timezone = tzlocal.get_localzone()
now = datetime.now(local_timezone)
one_pm = local_timezone.localize(datetime(now.year, now.month, now.day, 13),  # 1pm
        is_dst=None) # assert that there is no DST transition at 1pm
posix_time = one_pm.timestamp()

如果您的 Python 版本上没有 datetime.timestamp() method,那么很容易为one_pm 等时区感知日期时间对象实现它:

def posix_timestamp(aware, epoch=datetime(1970, 1, 1)):
    utc = aware.replace(tzinfo=None) - aware.utcoffset() # convert to utc
    return (utc - epoch).total_seconds()

如果下午 1 点没有 DST 转换,并且mktime() 在给定平台上使用正确的时区定义,则获取对应于下午 1 点的 Unix 时间:

#!/usr/bin/env python
import time

unix_time = time.mktime(time.localtime()[:3] + (13, 0, 0) + (-1,)*3)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-07
    • 2012-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多