博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Django和Mysql合用时,显示时间问题
阅读量:6785 次
发布时间:2019-06-26

本文共 2983 字,大约阅读时间需要 9 分钟。

这个以前没系统处理过,感觉前端页面显示正常,就OK。

但有的不重要的地方,显示有8小时错乱,也没有列入优先级处理。

昨天下细看了一些网上文档,找取了解决思路。

大致想法是:数据库里存+00:00时区的时间,而读到时间之后,具体的时区,由APP框架这一层来处理。

具体到DJANGO+MYSQL来说:

会关系到MYSQL的操作系统时区(MYSQL会读取这个设置,形成system_time_zone)  system_time_zone | CST,

MYSQL的时区: time_zone        +00:00

django框架的四个设置:

TIME_ZONE = 'Asia/Shanghai' USE_I18N = True USE_L10N = True USE_TZ = True

mysql相关命令:

show variables like '%time_zone%';select now();set time_zone='+00:00';set time_zone='SYSTEM';

操作系统输出:

# dateFri Aug 10 10:46:56 CST 2018

 

参考URL:

https://blog.csdn.net/ichuzhen/article/details/38555645

=================================================

五、Django 中使用 MySQL 存储时间遇到的问题

在此先说明一下,我所用的数据库时 CST 时区,与所在的服务器系统时间一致,Django 所在的 WEB 服务器也是统一台机器。在之前使用的过程中,从 Django 中获取到的 localtime 存储到数据库时会被系统自动处理增加8小时。针对这一问题,搜集了各方面的资料。下面就对 Django 的时区机制作个解释。

其实,Django 在配置文件 settings.py 中对时间时区有影响的是两个参数,一个是 TIME_ZONE,另一个是 USE_TZ。根据中的描述,这一属性默认值是 False。如果设置为 Ture,Django 内部将会使用对时区敏感的时间,否则 Django 将会使用系统本地的原有时间。(注意:为了方便,由 django-admin.py startproject 创建而来的项目 settings.py 中此项值设置为了 Ture)

与这一属性相关的还有 TIME_ZONE, USE_I18N 和 USE_L10N,下面我们来看一下这几个属性。

中说,在 Django 1.4 以后的版本中,这一属性值的意义是由 USE_TZ 决定的。这并不是服务器必须的,因为一个服务器可以服务多个 Django 框架的服务,并拥有各自的时区。

首先说明一点,在开启了 Django 所有关于时区的设置之后,本来以为 Django 将会以 UTC 标准时区连接数据库,但是经笔者测试(在 Django 中引入 django.db.connection 连接做查询)发现实际连接的时区是数据库系统的全局设置。确认这一点十分关键,因为它事关全部时间数据的时区问题。

如下是做的一些测试以说明问题。

 

操作 参数 情形1 情形2 情形3 情形4 情形5
Django settings.py TIME_ZONE Asia/Shanghai Asia/Shanghai Asia/Shanghai Asia/Shanghai Asia/Shanghai
USE_I18N TRUE TRUE TRUE TRUE TRUE
USE_L10N TRUE TRUE TRUE TRUE TRUE
USE_TZ TRUE False False TRUE False
DATETIME_FORMAT Y-m-j H:i:s Z Y-m-j H:i:s Z Y-m-j H:i:s Z Y-m-j H:i:s Z Y-m-j H:i:s Z
database time_zone system_time_zone China Standard Time China Standard Time China Standard Time China Standard Time China Standard Time
time_zone SYSTEM SYSTEM +00:00 +00:00 +00:00
存入 time.strftime('%Y-%m-%d %X', time.gmtime()) OR time.strftime('%Y-%m-%d %X', time.localtime()) 2014-08-27 23:43:19+08:00 2014-08-27 23:45:27 2014-08-27 15:48:56 2014-08-27 15:50:49+00:00 2014-08-27 15:50:49+00:00
在数据库中查询SET time_zone = '+00:00' DATETIME 2014-08-27 15:43:19 2014-08-27 23:45:27 2014-08-27 15:48:56 2014-08-27 15:50:49 2014-08-27 15:50:49
TIMESTAMP 2014-08-27 07:43:19 2014-08-27 15:45:27 2014-08-27 15:48:56 2014-08-27 15:50:49 2014-08-27 15:50:49
在 Django 中读取 DATETIME 2014-08-27 15:43:19+00:00 2014-08-27 23:45:27 2014-08-27 15:48:56 2014-08-27 15:50:49+00:00 2014-08-27 15:50:49
TIMESTAMP 2014-08-27 15:43:19 2014-08-27 23:45:27 2014-08-27 15:48:56 2014-08-27 15:50:49 2014-08-27 15:50:49
在 template 中显示 DATETIME 2014-8-27 23:43:19 28800 2014-8-27 23:45:27 28800 2014-8-27 15:48:56 28800 2014-8-27 23:50:49 28800 2014-8-27 15:50:49 28800
TIMESTAMP 2014-8-27 15:43:19 28800 2014-8-27 23:45:27 28800 2014-8-27 15:48:56 28800 2014-8-27 15:50:49 28800 2014-8-27 15:50:49 28800

 

由此可见,使用情形4的配置,设置 USE_TZ = Ture,数据库 time_zone = '+00:00',时间设置为 time.strftime('%Y-%m-%d %X', time.gmtime()),可以加时区 '+00:00'(数据库不会关心),在数据库中采用 DATETIME 类型存储最为合适。

你可能感兴趣的文章
如何防止http请求数据被篡改
查看>>
MyEclipse 2013集成JRebel
查看>>
indexOf()
查看>>
go语言学习
查看>>
tidb 安装
查看>>
phpcms V9.6.0版本整合百度ueditor1.4.3.2,包括水图片上传水印
查看>>
Tiptop GP中Excel的控制方法
查看>>
JavaWeb分页技术总结
查看>>
基于unity框架构造IOC容器
查看>>
Windows更新导致的打印问题
查看>>
Chrome 控制台不完全指南
查看>>
Notification与多线程
查看>>
高可用、高扩展性、负载均衡
查看>>
VIM用法
查看>>
oscache.properties文件配置
查看>>
新建索引的一些原则
查看>>
redis发布了集群版3.0.0 beta
查看>>
使用Gradle在嵌入式Web容器Jetty中运行Web应用
查看>>
100-98
查看>>
Innodb中的事务隔离级别和锁的关系
查看>>