2013-02-18 71 views
3

我在django中使用了datetime Python模塊。如果到期日期小於或等於當前日期的6個月,我期待計算日期。日期未來6個月

我想從當前日期起6個月生成一個日期的原因是設置一個警報,突出顯示發生該事件的字段/列。我不知道我的問題是否清楚。我一直在閱讀關於timedelta函數,但不能真正把我的頭圍繞它。我想寫一個if語句來確定這個條件。任何人都可以幫助我嗎?是Django和Python的新手。

回答

1

如果中「六個月」你的意思是180天,你可以使用:

import datetime 
d = datetime.date.today() 
d + datetime.timedelta(6 * 30) 

或者如果你的意思是實際6個月的日曆,你將有來查找calendar module,做每個一些查詢月。例如:

import datetime 
import calendar 

def add_6_months(a_date): 
    month = a_date.month - 1 + 6 
    year = a_date.year + month/12 
    month = month % 12 + 1 
    day = min(a_date.day,calendar.monthrange(year, month)[1]) 
    return datetime.date(year, month, day) 
6

有兩種做法,一種只是稍微不準確的,一個以不同的方式不準確的:

  • 添加365.25/2天一個datetime.timedelta()(平均每年長度除以二) :

    import datetime 
    sixmonths = datetime.datetime.now() + datetime.timedelta(days=365.25/2) 
    

    這種方法會給你一個6個月的日期時間戳,我們將6個monhs定義爲半年(平均)。

  • 使用外部dateutil library,它具有優異的relativedelta類,將基於日曆計算,以當前的日期添加6個月:

    import datetime 
    from dateutil.relativedelat import relativedelta 
    sixmonths = datetime.datetime.now() + relativedelta(months=6) 
    

    這種方法會給你一個日期戳6月進入未來,日期的月份部分已經被轉發了6,並且它會考慮月份邊界,確保不會越過它們。例如,8月30日加6個月變成2月28日或29日(允許閏年)。

演示可能會有幫助。在我的時區,在發佈的時間,這相當於:

>>> import datetime 
>>> from dateutil.relativedelta import relativedelta 
>>> now = datetime.datetime.now() 
>>> now 
datetime.datetime(2013, 2, 18, 12, 16, 0, 547567) 
>>> now + datetime.timedelta(days=365.25/2) 
datetime.datetime(2013, 8, 20, 3, 16, 0, 547567) 
>>> now + relativedelta(months=6) 
datetime.datetime(2013, 8, 18, 12, 16, 0, 547567) 

因此,有兩種方法之間1和15天小時的時差。

同樣的方法很好地工作datetime.date對象了:當應用到只有日期

>>> today = datetime.date.today() 
>>> today 
datetime.date(2013, 2, 18) 
>>> today + datetime.timedelta(days=365.25/2) 
datetime.date(2013, 8, 19) 
>>> today + relativedelta(months=6) 
datetime.date(2013, 8, 18) 

半年timedelta成爲teensy不太準確的(增量的5/8天組件已忽略) 。

+0

關於365.25/2方法的不錯建議。 – dmg 2013-02-18 11:13:24

+0

非常感謝...這對我很有用。 – roykasa 2013-02-18 11:27:31

+0

在發佈之前應該閱讀你的文章 - 沒有注意到你使用了'dateutil' - 哦! :)偉大的職位,很好解釋:) – 2013-02-18 11:28:31

0

我會給Delorean一個嚴肅的樣子。它建立在dateutilpytz之上,以完成你所要求的只是以下內容。

>>> d = Delorean() 
>>> d 
Delorean(datetime=2013-02-21 06:00:21.195025+00:00, timezone=UTC) 
>>> d.next_month(6) 
Delorean(datetime=2013-08-21 06:00:21.195025+00:00, timezone=UTC) 

它考慮到所有dateutil計算以及爲時區轉換提供和接口。在Delorean對象上獲取所需的日期時間簡單.datetime

相關問題