11

dbにフィールドtimestamp=models.DateTimeField(auto_now_add = True)があります。そのタイムスタンプとdatetime.now()の違いを見つけたいと思います。

datetime.now()-timestampを試したところ、次のエラーが発生します。

can't subtract offset-naive and offset-aware datetimes

これを修正するにはどうすればよいですか?

4

2 に答える 2

22

このエラーは、Pythonによって時間がどのように保存されるかを示しています。Pythonのドキュメントによると:

日付と時刻のオブジェクトには、「ナイーブ」と「アウェア」の2種類があります。この区別は、オブジェクトにタイムゾーン、夏時間、またはその他の種類のアルゴリズム的または政治的な時間調整の概念があるかどうかを示します。

djangoのドキュメントには次のようにも記載されています。

タイムゾーンのサポートが無効になっている場合、Djangoは現地時間で単純な日時オブジェクトを使用します。これは単純で、多くのユースケースに十分です。このモードでは、現在の時刻を取得するには、次のように記述します。

import datetime
now = datetime.datetime.now() 

タイムゾーンのサポートが有効になっている場合、Djangoはタイムゾーンを認識する日時オブジェクトを使用します。コードで日時オブジェクトを作成する場合は、それらも認識している必要があります。このモードでは、上記の例は次のようになります。

import datetime
from django.utils.timezone import utc
now = datetime.datetime.utcnow().replace(tzinfo=utc)

サイトでタイムゾーンを認識したいかどうかを判断し、それに応じて保存時間を調整する必要があります。認識されたdtをナイーブに変換するには、pytzモジュールを使用して次のようにします。

naive_dt = aware_dt.replace(tzinfo=None)

これが機能するのは、すべてのpython日時にオプションのタイムゾーン属性がありtzinfo、UTC時間からのdtのオフセットに関する情報を格納するために使用できるためです。

于 2012-05-15T05:16:40.723 に答える
0

Holá
短い答えは次のとおりです。

tz_info = your_timezone_aware_variable.tzinfo

diff = datetime.datetime.now(tz_info) - your_timezone_aware_variable:

タイムゾーン情報を now() 時間に追加する必要があります。ただし、変数の同じ
タイムゾーンを 追加する必要があるため、最初に tzinfo 属性を読み取ります。

于 2015-10-03T19:03:18.420 に答える