如何将日期时间舍入到特定时间?

时间:2016-02-24 18:15:13

标签: python datetime timezone

给定一个日期时间对象,如何将其四舍五入到下一次出现的8AM PST?

3 个答案:

答案 0 :(得分:1)

只测试时间是在8之前还是之后,然后添加一天,如果它在之后并构建一个新的日期时间。

$.get("refresh.php")
    .done(function(r) {
        var newDom = $(r);
        $('#avunits').replaceWith($('#avunits',newDom));
        $('#assigned').replaceWith($('#assigned',newDom));
        $('#pending').replaceWith($('#pending',newDom));
     });

答案 1 :(得分:1)

如果结果是时区中具有非固定UTC偏移的时区感知日期时间对象,那么您不能只调用.replace().combine() - 它可能会创建一个日期时间错误的UTC偏移。该问题类似于How do I get the UTC time of "midnight" for a given timezone?(使用00:00代替08:00)。

假设8AM在PST中始终存在并且明确无误:

from datetime import datetime, time as datetime_time, timedelta
import pytz # $ pip install pytz

def next_8am_in_pst(aware_dt, tz=pytz.timezone('America/Los_Angeles')):
    pst_aware_dt = tz.normalize(aware_dt.astimezone(tz)) # convert to PST
    naive_dt = round_up_to_8am(pst_aware_dt.replace(tzinfo=None))
    return tz.localize(naive_dt, is_dst=None)

def round_up_to_8am(dt):
    rounded = datetime.combine(dt, datetime_time(8))
    return rounded + timedelta(rounded < dt)

示例:

>>> str(next_8am_in_pst(datetime.now(pytz.utc))) 
'2016-02-25 08:00:00-08:00'

答案 2 :(得分:0)

我根据评论中的一些想法做出了回答:

def nextDay(d):
    pstTime = d.astimezone(pytz.timezone('US/Pacific'))
    pstTime = pstTime.replace(hour=8, minute=0, second=0, microsecond=0)

    if pstTime < d:
        pstTime += datetime.timedelta(days=1)

    return pstTime