web-dev-qa-db-ja.com

Django:タイムポストから時差を取得する方法は?

モデルのクラスがあるとしましょう

 class Post(models.Model):
     time_posted = models.DateTimeField(auto_now_add=True, blank=True)

     def get_time_diff(self):
         timediff = timediff = datetime.datetime.now() - self.time_posted
         print timediff # this line is never executed
         return timediff

私はget_time_diffを定義して、投稿が投稿されてから現在までの時差を取得しています。ドキュメントによると、DateTimeFieldは自動的にdatetimeに変換できるはずです。正しいですか。なぜprintステートメントが実行されないのですか?どのようにして時差を抽出できますか?

加えて、時間差を取得する場合、合計時間の秒数のように、時間差を整数に変換する簡単な方法があります。

19
dorafmon

コードはすでに機能しています。 _datetime.timedelta_オブジェクト が返されます。

代わりにの合計数を取得するには、結果の .total_seconds() method を呼び出す必要がありますtimedelta

_from Django.utils.timezone import utc

def get_time_diff(self):
    if self.time_posted:
        now = datetime.datetime.utcnow().replace(tzinfo=utc)
        timediff = now - self.time_posted
        return timediff.total_seconds()
_

.total_seconds()は、マイクロ秒を含むfloat値を返します。

Django datetimeはタイムゾーン対応DateTimeFieldオブジェクトも処理するため、timezone awaredatetimeオブジェクトを使用する必要があることに注意してください。 Django Timezonesのドキュメント を参照してください。

.total_seconds()のデモ(単純なdatetimeオブジェクトを使用しますが、原理は同じです):

_>>> import datetime
>>> time_posted = datetime.datetime(2013, 3, 31, 12, 55, 10)
>>> timediff = datetime.datetime.now() - time_posted
>>> timediff.total_seconds()
1304529.299168
_

両方のオブジェクトはタイムゾーンに対応している(_.tzinfo_属性がNoneではない)ため、それらの間の計算はタイムゾーンを処理し、どちらか一方のタイムゾーンを考慮に入れると、一方から他方を差し引くと正しく動作しますオブジェクト。

31
Martijn Pieters

テンプレート内でこれを行うと仮定すると、 timesince テンプレートタグを使用することもできます。

例えば:

{{ blog_date|timesince:comment_date }}
6
Wolph

Django=シグナルです。これが私のために働いているものです。これが役に立てば幸いです!

from Django.db.models.signals import pre_save
from Django.dispatch import receiver
from .models import YourModel
from datetime import datetime

@receiver(pre_save, sender = YourModel)
def beforeSave(sender, instance, **kwargs): 
     date_format = "%H:%M:%S"

     # Getting the instances in your model.
     time_start = str(instance.time_start)
     time_end = str(instance.time_end)

     # Now to get the time difference.
     diff = datetime.strptime(time_end, date_format) - datetime.strptime(time_start, date_format)

     # Get the time in hours i.e. 9.60, 8.5
     result = diff.seconds / 3600;
0
therealadrain

あなたのコード

timediff = datetime.datetime.now() - self.pub_date

時間差を取得するために動作するはずです。ただし、これは timedelta オブジェクトを返します。秒単位で差を取得するには、.seconds属性を使用します

timediff = datetime.datetime.now() - self.pub_date
timediff.seconds  # difference in seconds.
0
Rohan