说我有一个模特课
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来获取Post发布到现在的时间差,根据文档,DateTimeField应该能够自动转换为datetime,这是正确的吗?为什么print语句永远不会运行?你怎么能提取时差?
此外,如果你得到时差,是否有一种简单的方法可以将时差转换为整数,例如总时间的秒数。
答案 0 :(得分:31)
您的代码已经正常运行;返回datetime.timedelta
object。
要获取秒的总数,您需要在结果timedelta
上调用.total_seconds()
method:
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
值,包括微秒。
请注意,您需要使用时区感知 datetime
对象,因为Django DateTimeField
也处理时区感知datetime
对象。请参阅Django Timezones documentation。
演示.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
),所以它们之间的计算会处理时区,而从另一个中减去一个将会做正确的事情。考虑到任一对象的时区。
答案 1 :(得分:6)
答案 2 :(得分:0)
您的代码
timediff = datetime.datetime.now() - self.pub_date
应该努力获得时差。但是,这会返回timedelta
个对象。要在几秒钟内获得差异,请使用.seconds
属性
timediff = datetime.datetime.now() - self.pub_date
timediff.seconds # difference in seconds.
答案 3 :(得分:0)
以防万一,您希望将此过程放入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;