2014-01-15 66 views
3

我想通過從下個月的nth日減去今天的日期來獲得日期delta如何在Python中找到下個月的第n天?

delta = nth_of_next_month - todays_date 
print delta.days 

你如何獲得的第一個Date對象(或第二,第三..第n)下個月的日子。我試着從日期對象中獲取月份數並將其增加1.這顯然是一個愚蠢的想法,因爲12 + 1 = 13。我也嘗試在今天增加一個月並試圖到達本月的第一個月。我確信有一個更有效的方法來做到這一點。

+0

我想像所有你需要做的就是增加日期對象的月份財產achived。這個以前的答案顯示,因爲月屬性不可寫http://stackoverflow.com/a/4131114/333082 – cecilphillip

+0

爲什麼你在乎這裏「更高效」?陽光答案中顯而易見的簡單實現只需0.46us即可完成所有這些「昂貴」的工作,相比之下,1.64us可稱爲now()。所以我非常懷疑它會成爲你代碼中的瓶頸。最簡單的實現 - 您瞭解並且可以輕鬆調試 - 比最快的實現要好,除非它影響您的總運行時間。 – abarnert

+0

@abarnert正是我的意思......對我有效。沒有計算能力。 – Johnston

回答

7

dateutil庫是這個有用的:

from dateutil.relativedelta import relativedelta 
from datetime import datetime 

# Where day is the day you want in the following month 
dt = datetime.now() + relativedelta(months=1, day=20) 
+1

http://labix.org/python-dateutil#head-6a1472b7c74e5b8bab7784f11214250d34e09aa5解釋發生在relativedelta –

6

除非我失去了你的問題這個東西應該是簡單的:

import datetime 

now = datetime.datetime.now() 
nth_day = 5 
next_month = now.month + 1 if now.month < 12 else 1 # February 
year = now.year if now.month < 12 else now.year+1 
nth_of_next_month = datetime.datetime(year, next_month, nth_day) 
print(nth_of_next_month) 

結果:

2014-02-05 00:00:00 

使用dateutil作爲另一個答案建議是比這更好的主意,雖然。

2

另一種替代方法是使用delorean庫:

德洛雷安是提供容易且方便的日期時間 轉換Python中的庫。

>>> from delorean import Delorean 
>>> d = Delorean() 
>>> d.next_month() 
Delorean(datetime=2014-02-15 18:51:14.325350+00:00, timezone=UTC) 
>>> d.next_month().next_day(2) 
Delorean(datetime=2014-02-17 18:51:14.325350+00:00, timezone=UTC) 
+0

尼斯庫,設計與用戶的想法。 –

1

我的方法來計算下一個月沒有外部庫:

def nth_day_of_next_month(dt, n): 
    return dt.replace(
     year=dt.year + (dt.month // 12), # +1 for december, +0 otherwise 
     month=(dt.month % 12) + 1,  # december becomes january 
     day=n) 

這同時適用於datetime.datetime()datetime.date()對象。

演示:

>>> import datetime 
>>> def nth_day_of_next_month(dt, n): 
...  return dt.replace(year=dt.year + (dt.month // 12), month=(dt.month % 12) + 1, day=n) 
... 
>>> nth_day_of_next_month(datetime.datetime.now(), 4) 
datetime.datetime(2014, 2, 4, 19, 20, 51, 177860) 
>>> nth_day_of_next_month(datetime.date.today(), 18) 
datetime.date(2014, 2, 18) 
0

不使用任何外部庫,這可以如下

from datetime import datetime, timedelta 

def nth_day_of_next_month(n): 
    today = datetime.now() 
    next_month_dt = today + timedelta(days=32-today.day) 
    return next_month_dt.replace(day=n)