创建一张表:
class DateTest(models.Model):
import datetime
name = models.CharField(max_length=32,default='1')
t1 = models.DateField()
t2 = models.DateField(auto_now=True) # 自动更新时间
t3 = models.DateField(auto_now_add=True) # 添加数据是自动保存当前时间到数据库 创建时间时
t4 = models.DateTimeField(auto_now=True) # 差八小时 USE_TZ = False 用update更新数据时时间不会变 使用save会自动更新时间
t5 = models.DateTimeField(auto_now_add=True) # 差八小时 USE_TZ = False
# mysql查询的时间是UTC时间 datetime.datetime.now()是本地时间
添加数据看上述几个字段的时间变化:
from task import models
def test(request):
# 创建数据
models.DateTest.objects.create(
name='张三',
t1 = '2019-2-14'
)
return HttpResponse('ok')
数据库中时间字段:
上述可以看到:
t1 = models.DateField() :2019-02-14 # 自己插入的时间
t2 = models.DateField(auto_now=True) # 自动更新时间
t3 = models.DateField(auto_now_add=True) # 添加数据是自动保存当前时间到数据库 创建时间时
t4 = models.DateTimeField(auto_now=True) # 上面可以看到时间差八小时
t5 = models.DateTimeField(auto_now_add=True) # 差八小时
为什么会差八小时,因为django默认使用的是UTC时间:
USE_TZ = False # 让mysql不已UTC时间来存储时间数据
# django往mysql里面出数据的时候,如果这里的值为True,那么将让mysql强制使用UTC时间,
# 那么我们存储进入的时间,当你查询的时候,你就会发现,时间晚了8小时,
# 也就是说你存时间的时候被改为了UTC时间,本地是东八区,比UTC时间多8小时
更新数据:
# 更新数据
models.DateTest.objects.filter(
name='张三',
).update(name='李四')
数据库中可以看到名字改了但是时间刚刚已经设置为本地时间了,为什么时间还是UTC时间呢,因为auto_now用update更新数据时时间不会变:
只能自己指定时间:
# 更新数据
models.DateTest.objects.filter(
name='李四',
).update(name='王五',t4=datetime.datetime.now())
数据库中可以看到是本地时间:
重点:
从mysql中查出来的时间是UTC时间 而datetime.datetime.now()是本地时间,看上去存的是一样的,但是拿出来做计算是有问题的,因为一个是local.time另一个是utc.time,时间类型不一样。
使用model对象更新时间:
# 使用model对象更新数据
ret = models.DateTest.objects.filter(name='王五').first()
ret.name = '赵6'
ret.save()
数据库中,可以看到时间更新了,auto_now对save才会生效,会自动更新,auto_now_add不会自动更新,只是创建这条数据时添加的当前数据的创建时间:
总结:
auto_now:
1.差八小时 需要将settings.py中的USE_TZ = True改成USE_TZ = False
2.用update更新数据时时间不会变 使用save会自动更新时间
auto_now_add:
1.添加当前这条数据的创建时间