最近开始使用Django开发一些系统,在models.py中设置一些数据库表结构并给日期时间字段赋初值,不过在使用的过程中,遇到一点问题。问题是,我本来服务器使用的市区是“Asia/Shanghai”(+08:00),然后用datetime.now保存到数据库中时,里面的时间总是比我的系统时间相差8小时(感觉是UTC时间),但是我也查看了MySQL数据库中的时区是“+08:00”的(在MySQL中“SET GLOBAL time_zone = '+08:00';”语句可以设置时区)。这到底是什么原因呢?今天还花了不少时间来弄清楚这个问题。

我在models.py中定义的一个类如下(对于数据库中一张表):

Python

class TestSuite(models.Model):

id = models.AutoField(primary_key=True)

name = models.CharField(max_length=40, blank=True)

description = models.CharField(max_length=255, blank=True)

bu = models.CharField(max_length=40, blank=True)

is_enabled = models.BooleanField(default=True)

create_time = models.DateTimeField(default=datetime.now)

update_time = models.DateTimeField(default=datetime.now)

1

2

3

4

5

6

7

8

classTestSuite(models.Model):

id=models.AutoField(primary_key=True)

name=models.CharField(max_length=40,blank=True)

description=models.CharField(max_length=255,blank=True)

bu=models.CharField(max_length=40,blank=True)

is_enabled=models.BooleanField(default=True)

create_time=models.DateTimeField(default=datetime.now)

update_time=models.DateTimeField(default=datetime.now)

这里的create_time和update_time存到数据库中的时间总是UTC时区的时间(比北京时间慢了8个小时)。

Django还有一些warning打印出来:/Users/jay/workspace/te/env/lib/python2.7/site-packages/django/db/models/fields/__init__.py:903: RuntimeWarning: DateTimeField TestSuite.update_time received a naive datetime (2014-06-15 14:38:37.873873) while time zone support is active. RuntimeWarning)

这个warning的原因是,Django配置为使用timezone的datetime格式,而datetime.now是不包含timezone信息的。

如果不需要在程序中特别处理时区(timezone-aware),在Django项目的settings.py文件中,可以直接设置为“USE_TZ = False”就省心了。然后,在models.py中简单的设置为“ create_time = models.DateTimeField(auto_now_add=True)”和“update_time = models.DateTimeField(auto_now=True)”。

如果还要保持USE_TZ=True,则可设置为“default=datetime.now().replace(tzinfo=utc)” 。

我还试图去通过,django.utils.timezone.now()函数来获取当前时间,我还以为settings.py中已经设置“TIME_ZONE = 'Asia/Shanghai'”,就可以得到正确的时区和时间;可惜它依然得到的是UTC的时间,翻看它的实现就一下明白了,如下:

Python

def now():

"""

Returns an aware or naive datetime.datetime, depending on settings.USE_TZ.

"""

if settings.USE_TZ:

# timeit shows that datetime.now(tz=utc) is 24% slower

return datetime.utcnow().replace(tzinfo=utc)

else:

return datetime.now()

1

2

3

4

5

6

7

8

9

defnow():

"""

Returns an aware or naive datetime.datetime, depending on settings.USE_TZ.

"""

ifsettings.USE_TZ:

# timeit shows that datetime.now(tz=utc) is 24% slower

returndatetime.utcnow().replace(tzinfo=utc)

else:

returndatetime.now()

另外,如果USE_TZ=True,那么设置auto_now_add=True(或auto_now=True)可以达到我的目的吗?答案也是否定的,翻看了一下Django对auto_now_add=True的处理就明白了,它就是对其赋值为 django.utils.timezone.now() 。

还是试图通过timezone来使用系统本地时间和时区,比如:default=timezone.localtime(timezone.now()) ,结果发现,也是不行的,存到MySQL中也是UTC时区的日期时间。得看下Django相应的实现代码了,DateTimeField与MySQL数据库交互的时候,是否都先转换为UTC的时间再更新到数据库的。

参考资料:

https://docs.djangoproject.com/en/1.4/ref/settings/#time-zone

https://docs.djangoproject.com/en/dev/topics/i18n/timezones/#usage

php mysql datetime时区,Django models通过DateTimeField保存到MySQL的时间的时区问题相关推荐

  1. DJANGO MODELS通过DATETIMEFIELD保存到MYSQL的时间的时区问题

    最近开始使用Django开发一些系统,在models.py中设置一些数据库表结构并给日期时间字段赋初值,不过在使用的过程中,遇到一点问题.问题是,我本来服务器使用的市区是"Asia/Shan ...

  2. localdate存mysql相差一天_如何在保存到mySQL数据库时阻止LocalDate更改

    使用JPA CriteriaBuilder API将LocalDate字段(例如'2017-09-27′)保存到mySQL Date列时,结果不同(例如'2017-09-26′). 我已经使用SELE ...

  3. session mysql java_PHP自定义session处理方法,保存到MySQL数据库中

    我们都知道,session是为了解决因特网的无状态属性而创造出来的.我们可以用session这种会话管理机制来构建购物车.监控站点网络访问,甚至还可以跟踪某一个用户具体是如何使用你的应用的.PHP默认 ...

  4. 使用python scrapy爬取全国小区信息(包括小区价格,经纬度,面积,户数等),并保存到mysql和excel

    目标 此次爬取的网站是楼盘网,因为只爬取小区信息,所以先从深圳小区(http://sz.loupan.com/community/)网页入手分析,然后发散爬取至全国. 爬取的信息包括 省,所属市,所属 ...

  5. mysql t 保存_检查 (调试) - 离线消息保存到 MySQL - 《EMQ X Enterprise v4.1 中文文档》 - 书栈网 · BookStack...

    离线消息保存到 MySQL 搭建 MySQL 数据库,并设置用户名密码为 root/public,以 MacOS X 为例: $ brew install mysql $ brew services ...

  6. php 读取mysql 返回xml_用php解析xml并保存到mysql

    我被要求解析一个存储为XML文件的简单文件,然后将数据保存到MySQL. 然而,我完全不知道该怎么做,并且在网上查看之后,给出的所有示例对于我的问题来说似乎太复杂,或者不是正确的解决方案.XML文件如 ...

  7. monolog mysql_Laravel框架使用monolog_mysql实现将系统日志信息保存到mysql数据库的方法...

    本文实例讲述了Laravel框架使用monolog_mysql实现将系统日志信息保存到mysql数据库的方法.分享给大家供大家参考,具体如下: Laravel中使用monolog_mysql将系统日志 ...

  8. monolog 存入mysql_Laravel框架使用monolog_mysql实现将系统日志信息保存到mysql数据库的...

    本文实例讲述了Laravel框架使用monolog_mysql实现将系统日志信息保存到mysql数据库的方法.,具体如下: Laravel中使用monolog_mysql将系统日志信息保存到mysql ...

  9. kafka偏移量保存到mysql里_SparkStreaming+kafka保存offset的偏移量到mysql案例

    MySQL创建存储offset的表格 mysql> use test mysql> create table hlw_offset( topic varchar(32), groupid ...

最新文章

  1. Linux命令技巧之30个必会的命令技巧
  2. python的import与from...import的不同之处
  3. django-request对象
  4. 编程之基础:数据类型(二)
  5. zabbix聚合图形创建脚本
  6. ocp证书怎么考_没有基础怎么考初级会计证书?
  7. Logstash入门简介
  8. windows 哪些服务必须打开
  9. cookie与session以及他们的常规用途——web开发必须熟知的知识
  10. 软件设计模式(持续更新)
  11. 教你制作高逼格的技术分享Keynote(PPT)
  12. 一.微信公众号迁移流程 openid转换
  13. POI Cannot add merged region XXX to sheet because it overlaps with an existing merged region问题解决
  14. svn提交变慢,svn update提示Node remains in conflict报错解决办法
  15. python基础螺旋线
  16. 属于EDG的奇迹之夜
  17. 一元三次方程求根公式推导
  18. OIer专用-网址导航
  19. 程序员的佛系炒股日常
  20. ABAP 创建及修改采购申请

热门文章

  1. 构建高性能.NET应用之配置高可用IIS服务器-第四篇 IIS常见问题之:工作进程回收机制(上)
  2. django06: ORM示例2--uer 与file
  3. 如何找tensorflow-gpu版本对应的cuda和cudnn
  4. [转]分布式事务之TCC服务设计和实现注意事项
  5. 解决安装SQL Server 2005开发版时,出现“SQL Server 服务无法启动 ”点击重试或取消的解决方法
  6. 【Envi风暴】Envi 5.4遥感影像镶嵌原来如此简单!
  7. Android Studio之编译t提示Invoke-customs are only supported starting with Android O (--min-api 26)
  8. C和指针之strcat函数 strchr函数 strcmp函数 strcpy函数 strnchr函数 strstr函数实现
  9. Android之获取应用程序(包)的大小-----PackageManager的使用(二)
  10. Android之DiskLruCache(缓存工具)