簡體   English   中英

什么是處理日期時間值溢出的最佳方法

[英]What is the best way to handle datetime value overflow

我正在嘗試構建一個程序來處理警報。 我希望它能夠處理特定日期(例如2015年8月23日7:00)和相對日期(例如從現在起5天7個小時)。 特定日期很好,但是對於相對日期,如果我嘗試在日期時間加上5天7個小時,它可能會溢出該地點的預定值

import datetime
dt = datetime.datetime.now()
dayslater = 5
hourslater = 7
minuteslater = 30
alarmTime = datetime.datetime(dt.year, dt.month, dt.day + dayslater,
                              dt.hour + hourslater,
                              dt.minute + minuteslater, 0,0)

有時候可以,但是如果之后的天數是40天,它將溢出該值。 我確實設置了一個簡單的

if hours >= 24: 
    hours -= 24
    days++

但是,這對於幾天之內長度不一致的數月不起作用。

別。 日期很難 ,而且很容易弄錯。

而是使用timedelta

In [1]: from datetime import datetime, timedelta

In [2]: dt = datetime.now()

In [3]: dt
Out[3]: datetime.datetime(2015, 7, 23, 15, 2, 55, 836914)

In [4]: alarmTime = dt + timedelta(days=5, hours=7, minutes=30)

In [5]: alarmTime
Out[5]: datetime.datetime(2015, 7, 28, 22, 32, 55, 836914)

使用datetime.timedelta()對象並將計算結果留給datetime庫:

import datetime

delta = datetime.timedelta(days=dayslater, hours=hourslater, minutes=minuteslater)
alarmTime = datetime.datetime.now() + delta

演示:

>>> import datetime
>>> dt = datetime.datetime.now()
>>> dayslater = 5
>>> hourslater = 7
>>> minuteslater = 30
>>> delta = datetime.timedelta(days=dayslater, hours=hourslater, minutes=minuteslater)
>>> delta
datetime.timedelta(5, 27000)
>>> dt
datetime.datetime(2015, 7, 23, 21, 4, 59, 987926)
>>> dt + delta
datetime.datetime(2015, 7, 29, 4, 34, 59, 987926)

請注意小時數如何延續到第二天(從21:04到04:34),因此日期從23日變為29日。 我不必擔心這里的“溢出”。

自2月29日起,此功能將繼續在月份邊界,年份邊界和leap年使用:

>>> datetime.datetime(2015, 7, 26, 22, 42) + delta
datetime.datetime(2015, 8, 1, 6, 12)
>>> datetime.datetime(2015, 12, 26, 22, 42) + delta
datetime.datetime(2016, 1, 1, 6, 12)
>>> datetime.datetime(2016, 2, 23, 22, 42) + delta
datetime.datetime(2016, 2, 29, 6, 12)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM