【发布时间】:2015-08-29 14:56:13
【问题描述】:
我怎样才能真正为下一个 6 点钟创建时间戳,无论是今天还是明天?
我尝试了 datetime.datetime.today() 并用 +1 和 hour = 6 替换一天,但我无法将其转换为时间戳。
需要你的帮助
【问题讨论】:
标签: python date datetime timestamp python-2.5
我怎样才能真正为下一个 6 点钟创建时间戳,无论是今天还是明天?
我尝试了 datetime.datetime.today() 并用 +1 和 hour = 6 替换一天,但我无法将其转换为时间戳。
需要你的帮助
【问题讨论】:
标签: python date datetime timestamp python-2.5
在处理正确遵守夏令时 (DST) 的时区时获得下一个 6 点:
from datetime import datetime, time, timedelta
import pytz # $ pip install pytz
from tzlocal import get_localzone # $ pip install tzlocal
DAY = timedelta(1)
local_timezone = get_localzone()
now = datetime.now(local_timezone)
naive_dt6 = datetime.combine(now, time(6))
while True:
try:
dt6 = local_timezone.localize(naive_dt6, is_dst=None)
except pytz.NonExistentTimeError: # no such time today
pass
except pytz.AmbiguousTimeError: # DST transition (or similar)
dst = local_timezone.localize(naive_dt6, is_dst=True)
std = local_timezone.localize(naive_dt6, is_dst=False)
if now < min(dst, std):
dt6 = min(dst, std)
break
elif now < max(dst, std):
dt6 = max(dst, std)
break
else:
if now < dt6:
break
naive_dt6 += DAY
一旦你有了一个代表本地时区下一个 6 点钟的感知日期时间对象,就很容易获得时间戳:
timestamp = dt6.timestamp() # in Python 3.3+
或者在较旧的 Python 版本上:
timestamp = (dt6 - datetime(1970, 1, 1, tzinfo=pytz.utc)).total_seconds()
见Converting datetime.date to UTC timestamp in Python。
解决方案即使 任何发生以下情况:
time.mktime() calls)无法访问给定系统(特别是:Windows)上的历史时区数据库—pytz 提供对 tz 数据库的可移植访问X 小时之间有一个 DST 转换(在您的情况下,X 是早上 6 点)或者如果本地时区的 UTC 偏移量因任何其他原因而发生更改 — "naive datetime object + relativedelta" solution would fail silently 以查找正确的秒数,但时区感知的日期时间对象可以找到正确的时差X 小时(今天或明天)在本地时区中不存在或不明确(大多数情况下,它发生在 DST 转换期间 - 每年在许多时区中)。 Solutions using dateutil tzinfos or pytz-based solutions that use .localize() without is_dst=None would fail silently。在这种情况下,应用程序应明确处理 NonExistentTimeError 和 AmbiguousTimeError 异常X 小时之后,但在第二次出现X 小时之前—"rrule + return min(localize(ndt, is_dst=True), localize(ndt, is_dst=False))" solution would fail silently。上面AmbiguousTimeError 子句中的min/max 代码可以正确处理它。【讨论】:
要为明天早上 6 点生成时间戳,您可以使用以下内容。这将创建一个表示当前时间的 datetime 对象,检查当前时间是否小于 6 点,为下一个 6 点创建一个 datetime 对象(包括在必要时添加递增日期),最后转换将日期时间对象转换为时间戳
from datetime import datetime, timedelta
import time
# Get today's datetime
dtnow = datetime.now()
# Create datetime variable for 6 AM
dt6 = None
# If today's hour is < 6 AM
if dtnow.hour < 6:
# Create date object for today's year, month, day at 6 AM
dt6 = datetime(dtnow.year, dtnow.month, dtnow.day, 6, 0, 0, 0)
# If today is past 6 AM, increment date by 1 day
else:
# Get 1 day duration to add
day = timedelta(days=1)
# Generate tomorrow's datetime
tomorrow = dtnow + day
# Create new datetime object using tomorrow's year, month, day at 6 AM
dt6 = datetime(tomorrow.year, tomorrow.month, tomorrow.day, 6, 0, 0, 0)
# Create timestamp from datetime object
timestamp = time.mktime(dt6.timetuple())
print(timestamp)
【讨论】:
if dtnow.hour < 6,例如if dtnow.hour < 6:\n dt6 = datetime(dtnow.year, dtnow.month, dtnow.day, 6, 0, 0, 0)\nelse:。如果这就是您要查找的内容,我可以在上面添加 if 条件。
time.mktime() 可能会失败,如果本地时区在不同日期(大部分时间)可能有不同的 UTC 偏移量。 Use pytz module that provides a portable access to the tz database instead