How to convert tomorrows (at specific time) date to a timestamp

陌路散爱 提交于 2019-11-28 01:53:18

问题


How can i actually create a timestamp for the next 6 o'clock, whether that's today or tomorrow?

I tried something with datetime.datetime.today() and replace the day with +1 and hour = 6 but i couldnt convert it into a timestamp.

Need your help


回答1:


To generate a timestamp for tomorrow at 6 AM, you can use something like the following. This creates a datetime object representing the current time, checks to see if the current hour is < 6 o'clock or not, creates a datetime object for the next 6 o'clock (including adding incrementing the day if necessary), and finally converts the datetime object into a timestamp

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)



回答2:


To get the next 6 o'clock while handling timezones that observe Daylight saving time (DST) correctly:

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

Once you have an aware datetime object that represents the next 6 o'clock in the local timezone, it is easy to get the timestamp:

timestamp = dt6.timestamp() # in Python 3.3+

Or on older Python versions:

timestamp = (dt6 - datetime(1970, 1, 1, tzinfo=pytz.utc)).total_seconds()

See Converting datetime.date to UTC timestamp in Python.

The solution works even if any of the following happens:

  • python (e.g., time.mktime() calls) has no access to a historical timezone database on a given system (notably: Windows)—pytz provides a portable access to the tz database
  • there is a DST transition between now and the next X hour (where X is 6am in your case) or if the UTC offset for the local timezone has changed for any other reason—"naive datetime object + relativedelta" solution would fail silently to find the correct number of seconds but timezone-aware datetime objects could enable to find the right time difference
  • the nominal next X hour (today or tomorrow) does not exist or ambiguous in the local time zone (most often, it happens during DST transitions—every year in many timezones). Solutions using dateutil tzinfos or pytz-based solutions that use .localize() without is_dst=None would fail silently. The application should handle NonExistentTimeError and AmbiguousTimeError exceptions explicitly in this case
  • the current time is after the first time an ambiguous X hour happens in the local timezone but before the second time the X hour happens —"rrule + return min(localize(ndt, is_dst=True), localize(ndt, is_dst=False))" solution would fail silently. The min/max code in the AmbiguousTimeError clause above handles it correctly.


来源:https://stackoverflow.com/questions/30822699/how-to-convert-tomorrows-at-specific-time-date-to-a-timestamp

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!