Djangoのデータベースのdatetime
フィールドに100年を減算または追加するにはどうすればよいですか?
日付はデータベースにあります。フィールドを取得せずに直接更新して、計算してから挿入するだけです。
Dateutil.relativedeltaパッケージのrelativedelta関数を使用すると、「n年前」の計算がより正確になります。
from dateutil.relativedelta import relativedelta
import datetime
years_ago = datetime.datetime.now() - relativedelta(years=5)
次に、他の人がここに示すように、日付フィールドを更新します。
timedelta を使用します。このような何かがトリックを行う必要があります:
import datetime
years = 100
days_per_year = 365.24
hundred_years_later = my_object.date + datetime.timedelta(days=(years*days_per_year))
Django=クエリセットの.update()
メソッドを使用すると、データベースからオブジェクトを取得せずにすべての値を更新できます。 F()
オブジェクト 。
残念ながら、Pythonのタイムデルタは何年も機能しないため、日数で表される100年(36524.25)を計算する必要があります。
MyModel.objects.update(timestamp=F('timestamp')+timedelta(days=36524.25))
データベースからDjango datetime
フィールドの値を取得すると、Python datetime
オブジェクトの形式になります。
Python datetimeオブジェクトに100年を追加する最も簡単な方法は次のとおりです。
_from datetime import datetime
d = datetime_object_from_database
d_plus_100_years = datetime(d.year + 100, *d.timetuple()[1:-2])
_
次に、それをデータベースに保存します。ただし、コメントで指摘されているように、日付が1年のle日である400の倍数である場合、これは完全に失敗します。
私はそれが古い質問であることを知っていますが、私の問題を解決するために良いものを見つけるために問題がありました、私はこれを作成しました:
import datetime # Don't forget to import it
def subadd_date(date,years):
''' Subtract or add Years to a specific date by pre add + or - '''
if isinstance(date,datetime.datetime) and isinstance(years,int):
day,month,year = date.day , date.month , date.year
#If you want to have HOUR, MINUTE, SECOND
#With TIME:
# day,month,year,hour,minute,second = date.day, date.month,date.year,date.hour,date.minute,date.second
py = year + years # The Past / Futur Year
new_date_str = "%s-%s-%s" % (day,month,py) # New Complete Date
# With TIME : new_date_str = "%s-%s-%s %s:%s:%s" % (month,day,py,hour,minute,second)
try:
new_date = datetime.datetime.strptime(new_date_str,"%d-%m-%Y")
except ValueError: # day is out of range for month (February 29th)
new_date_str = "%s-%s-%s" % (1,month+1,py) # New Complete Date : March 1st
new_date = datetime.datetime.strptime(new_date_str,"%d-%m-%Y")
return new_date
# With TIME : return datetime.datetime.strptime(new_date_str,"%d-%m-%Y %H:%M:%Y")
return None