如何将明天(在特定时间)日期转换为时间戳

时间:2015-06-13 19:29:43

标签: python date datetime timestamp python-2.5

我如何实际为下一个6点钟创建时间戳,无论是今天还是明天?

我尝试使用datetime.datetime.today()并用+1和小时= 6替换日,但我无法将其转换为时间戳。

需要你的帮助

2 个答案:

答案 0 :(得分:5)

要在明天早上6点生成时间戳,您可以使用以下内容。这将创建一个表示当前时间的日期时间对象,检查当前时间是否为<或者不是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)

答案 1 :(得分:1)

要在处理正确观察夏令时(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

即使 以下任何,解决方案也可以

  • python(例如,time.mktime() calls)无法访问给定系统上的历史时区数据库(特别是:Windows) - pytz提供对tz数据库的可移植访问
  • 现在和下一个X小时之间有一个DST转换(在您的情况下X是早上6点)或者当地时区的UTC偏移由于任何其他原因而发生了变化 - {{ 3}}找到正确的秒数但是时区感知的日期时间对象可以找到正确的时差
  • 名义下一个X小时(今天或明天)在当地时区不存在或不明确(大多数情况下,它发生在DST过渡期间 - 每年在许多时区)。 "naive datetime object + relativedelta" solution would fail silently。在这种情况下,应用程序应明确处理NonExistentTimeErrorAmbiguousTimeError例外
  • 当前时间是第一次在当地时区发生不明确的X小时之后,但在X小时第二次发生之前 - Solutions using dateutil tzinfos or pytz-based solutions that use .localize() without is_dst=None would fail silently。上面min子句中的max / AmbiguousTimeError代码可以正确处理它。