2011-02-09 14 views
1

私は2つのDateField変数を持っており、それらを減算してその差を最も近い月の月数として返したいと思います。どうすればいい?Djangoで日付を差し引く?

ありがとうございました!

+0

「月」はどれくらいですか? –

+0

1ヶ月は30日ありがとうございます。 – Andrew

+0

最近python-dateutilパッケージにrelativedeltaが見つかりました。次のようなことをするのには非常に便利です:http://labix.org/python-dateutil#head-ba5ffd4df8111d1b83fc194b97ebecf837add454 – joshcartme

答えて

3

>>> import datetime 
>>> a = datetime.date(2011, 2, 8) 
>>> b = datetime.date(2010, 5, 14) 
>>> months(a, b) 
9 

編集、あなたはあまりにも日をもとに丸めたい場合:

months = lambda a, b: abs((a.year - b.year) * 12 + a.month - b.month) + int(abs(a.day - b.day) > 15) 

例:

>>> import datetime 
>>> a = datetime.date(2011, 2, 8) 
>>> b = datetime.date(2010, 5, 14) 
>>> months(a, b) 
9 
>>> b = datetime.date(2010, 5, 30) 
>>> months(a, b) 
10 
+2

代わりに、日付差分と 'timedelta'オブジェクトを使用することを検討してください。 – Arnaud

+0

ありがとうございました! – Andrew

+0

もう一つの答えは 'timedelta'オブジェクトを使っていましたが、それは日数で解決されているので(この時点で月/年の情報は失われています)、実際の暦月の差分を得る方法はないようです。 30で除算するのは近似値に過ぎず、エラーは長いタイムパンに累積されます。 – ezod

5

日付フィールドはdatetime.dateインスタンスです。直接減算するとtimedeltaが得られます。 timedelta.daysでtimedeltaが表す日数にアクセスできます。

today = datetime.date.today() 
n = today - self.date 
months = int(n.days/30) 

あなたは、最寄りの月を定義する方法に応じて、このケース2であなたの月数を与える必要がありますにキャストするのではなく四捨五入する必要があるかもしれません:日付フィールドのself.dateは2ヶ月前に設定されているとしましょうint。

months = lambda a, b: abs((a.year - b.year) * 12 + a.month - b.month) 

例:暦月の長さを使用して、明確な答えを

0
def date_diff: 
now = datetime.now().date() 
s=seo_job.job_end_date.replace(hour=23,minute=59,second=59).date() 
#seo_job.job_end_date an end date that is saved in db 
return (now-s)