这需要微秒!
import mathdef ceil_dt(dt): # how many secs have passed this hour nsecs = dt.minute*60 + dt.second + dt.microsecond*1e-6 # number of seconds to next quarter hour mark # Non-analytic (brute force is fun) way: # delta = next(x for x in xrange(0,3601,900) if x>=nsecs) - nsecs # analytic way: delta = math.ceil(nsecs / 900) * 900 - nsecs #time + number of seconds to quarter hour mark. return dt + datetime.timedelta(seconds=delta)t1 = datetime.datetime(2017, 3, 6, 7, 0)assert ceil_dt(t1) == t1t2 = datetime.datetime(2017, 3, 6, 7, 1)assert ceil_dt(t2) == datetime.datetime(2017, 3, 6, 7, 15)t3 = datetime.datetime(2017, 3, 6, 7, 15)assert ceil_dt(t3) == t3t4 = datetime.datetime(2017, 3, 6, 7, 16)assert ceil_dt(t4) == datetime.datetime(2017, 3, 6, 7, 30)t5 = datetime.datetime(2017, 3, 6, 7, 30)assert ceil_dt(t5) == t5t6 = datetime.datetime(2017, 3, 6, 7, 31)assert ceil_dt(t6) == datetime.datetime(2017, 3, 6, 7, 45)t7 = datetime.datetime(2017, 3, 6, 7, 45)assert ceil_dt(t7) == t7t8 = datetime.datetime(2017, 3, 6, 7, 46)assert ceil_dt(t8) == datetime.datetime(2017, 3, 6, 8, 0)
说明
delta:
- 900秒是15分钟(四分之一小时 不包含leap秒,我认为日期时间无法处理… )
nsecs / 900
是已发生的四分之一小时块的数量。ceil
以此取整四分之一小时的块数。- 将四分之一小时的块数乘以900,以计算自“四舍五入”后的小时开始以来已经发生了多少秒。



