How to convert tomorrows (at specific time) date to a timestamp
我怎样才能为下一个6点创建一个时间戳,无论是今天还是明天?
我尝试使用datetime.datetime.today()并用+1和小时= 6替换日,但我无法将其转换为时间戳。
需要你的帮助
要在明天早上6点生成时间戳,您可以使用以下内容。这将创建一个表示当前时间的日期时间对象,检查当前时间是否为<6时,是否为下一个6点钟创建一个日期时间对象(包括在必要时添加增加日期),最后转换将datetime对象转换为时间戳
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | 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) |
要在处理正确观察夏令时(DST)的时区时接下来的6点钟:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | 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点的日期时间对象,就很容易得到时间戳:
1 | timestamp = dt6.timestamp() # in Python 3.3+ |
或者在较旧的Python版本上:
1 | timestamp = (dt6 - datetime(1970, 1, 1, tzinfo=pytz.utc)).total_seconds() |
请参阅在Python中将datetime.date转换为UTC时间戳。
即使发生以下任何情况,该解决方案仍然有效:
-
python(例如,
time.mktime() 调用)无法访问给定系统上的历史时区数据库(特别是:Windows) -pytz 提供对tz数据库的可移植访问 -
从现在到下一个
X 小时之间存在DST转换(在您的情况下X 是早上6点)或者如果本地时区的UTC偏移因任何其他原因而发生了变化 -"天真的日期时间对象+ relativedelta"解决方案将无声地失败以找到正确的秒数,但是时区感知的日期时间对象可以找到正确的时差 -
名义下一个
X 小时(今天或明天)在当地时区不存在或不明确(大多数情况下,它发生在DST过渡期间 - 每年在许多时区)。使用dateutil tzinfos或基于pytz 的解决方案使用.localize() 而不使用is_dst=None 的解决方案将无声地失败。在这种情况下,应用程序应明确处理NonExistentTimeError 和AmbiguousTimeError 异常 -
当前时间是第一次在本地时区发生模糊
X 小时之后但在第二次X 小时发生之前 -"rrule +return min(localize(ndt, is_dst=True), localize(ndt, is_dst=False)) "解决方案将无声地失败。上面AmbiguousTimeError 子句中的min /max 代码正确处理它。