2016-02-24 84 views
0

給定一個日期時間對象,我如何將它整理爲下一次出現的8AM PST?如何將日期時間四捨五入到特定時間?

+1

創建一個新的日期時間,使用從當前日期時間的年,月,日的輸入,並設置小時,分鐘,秒分別爲8,0,0, – Ian

+2

@伊恩:這將永遠是今天的上午8點。要總是四捨五入,除非在上午8點之前,否則你需要在上面再增加一天。 – jsfan

+0

相關:[在Python中舍入到最近30分鐘](http://stackoverflow.com/q/32723150/4279) – jfs

回答

1

如果結果是一個時區時區感知DateTime對象與非固定UTC偏移,那麼你可以不只是打電話.replace().combine() - 它可能會創建一個日期時間與錯誤的UTC偏移。該問題類似於How do I get the UTC time of "midnight" for a given timezone?(使用00:00代替08:00)。

假設早上8點一直存在,並明確在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' 
+0

謝謝,這適用於夏令時邊界。 – camomilk

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 
+1

它可能會在DST轉換日期前失敗 – jfs

1

只是測試的時間是否是前或後8,然後加了一天,如果它的後面,構建一個新的日期時間。

import datetime 

def round_datetime(dt): 
    t = datetime.time(8) 
    # If time is after 8am, add a day. 
    if dt.time() > datetime.time(8): 
     dt += datetime.timedelta(days=1) 
    return datetime.datetime.combine(dt, t) 
+0

謝謝,我沒有意識到你可以拆分這樣的日期和時間。 – camomilk

+0

如果輸入是一個可識別時區的日期時間對象,那麼它更復雜(如果輸入是一個天真的日期時間對象,則代碼可以)。 – jfs

相關問題