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

后端 未结 2 461
南笙
南笙 2020-12-18 10:57

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 da

相关标签:
2条回答
  • 2020-12-18 11:31

    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.
    0 讨论(0)
  • 2020-12-18 11:47

    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)
    
    0 讨论(0)
提交回复
热议问题