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

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

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)

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) 这里的create_time和update_time存到数据库中的时间总是UTC时区的时间(比北京时间慢了8个小时)。

这个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的时间,翻看它的实现就一下明白了,如下:

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()

还是试图通过timezone来使用系统本地时间和时区,比如:default=timezone.localtime(timezone.now()) ,结果发现,也是不行的,存到MySQL中也是UTC时区的日期时间。得看下Django相应的实现代码了,DateTimeField与MySQL数据库交互的时候,是否都先换为UTC的时间再更新到数据库的。另外,如果USE_TZ=True,那么设置auto_now_add=True(或auto_now=True)可以达到我的目的吗?答案也是否定的,翻看了一下Django对auto_now_add=True的处理就明白了,它就是对其赋值为 django.utils.timezone.now() 。

参考资料:

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

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

Django models通过DateTimeField保存到MySQL的时间的时区问题的更多相关文章

  1. Asp.net Session 保存到MySql中

    一 网站项目引入"mysql.web.dll" 二 web.config配置中添加mysql数据库连接字符串 <connectionStrings> <remov ...

  2. pandas对象保存到mysql出错提示“BLOB/TEXT column used in key specification without a key length”解决办法

    问题 将DataFrame数据保存到mysql中时,出现错误提示: BLOB/TEXT column used in key specification without a key length 原因 ...

  3. php将图片以二进制保存到mysql数据库并显示

    一.存储图片的数据表结构: -- -- 表的结构 `image` -- CREATE TABLE IF NOT EXISTS `image` ( `id` int(3) NOT NULL AUTO_I ...

  4. Python scrapy爬虫数据保存到MySQL数据库

    除将爬取到的信息写入文件中之外,程序也可通过修改 Pipeline 文件将数据保存到数据库中.为了使用数据库来保存爬取到的信息,在 MySQL 的 python 数据库中执行如下 SQL 语句来创建 ...

  5. 微信昵称有特殊符号怎么保存到mysql库里?

    微信昵称有特殊符号怎么保存到mysql库里? mysql库怎么保存emoji表情? 这里提供 1 种稳妥有效的方法: // 入库之前,使用 Base64 编码 String nickname = re ...

  6. 爬取伯乐在线文章(四)将爬取结果保存到MySQL

    Item Pipeline 当Item在Spider中被收集之后,它将会被传递到Item Pipeline,这些Item Pipeline组件按定义的顺序处理Item. 每个Item Pipeline ...

  7. 将爬取的数据保存到mysql中

    为了把数据保存到mysql费了很多周折,早上再来折腾,终于折腾好了 安装数据库 1.pip install pymysql(根据版本来装) 2.创建数据 打开终端 键入mysql -u root -p ...

  8. node 爬虫 --- 将爬取到的数据,保存到 mysql 数据库中

    步骤一:安装必要模块 (1)cheerio模块 ,一个类似jQuery的选择器模块,分析HTML利器. (2)request模块,让http请求变的更加简单 (3)mysql模块,node连接mysq ...

  9. Springboot(八):emoji表情保存到mysql出错的解决办法

    emoji表情保存到mysql出错的解决办法 今天,在前端的说明信息中输入emoji表情的时候,插入数据库会报错 百度了一下,是因为mysql数据库的字符编码集不正确,utf8无法存入表情字符,只能将 ...

随机推荐

  1. 暴力求解——最大乘积 Maximum Product,UVa 11059

    最大乘积 Maximum Product 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=84562#problem/B 解题思路 ...

  2. Cocos2d-iphone 为sprite添加双击的事件响应

    这篇文章介绍两种方式处理cocos2d中的双击事件响应. 在iOS中使用UITapGestureRecognizer ,很容易就可以添加双击事件处理,但是在cocos2d中无法直接向sprite添加U ...

  3. OPENCV第一篇

    了解过之前老版本OpenCV的童鞋们都应该清楚,对于OpenCV1.0时代的基于 C 语言接口而建的图像存储格式IplImage*,如果在退出前忘记release掉的话,就会照成内存泄露.而且用起来超 ...

  4. 【Java规划】DOM XML Parser分解、遍历、创XML

    1.前言 DOM XML Parser简介 DOM 它是 W3C 处理 XML 规范 API,这是很多其他的 XML 地基处理相关标准,不仅是 Java,其他的,如 Javascript,PHP.MS ...

  5. OSChina 其中很重要的一类——RequestContext

    RequestContext 这个类在 OSChina 中是很重要的一个类.该类由全局 Filter 进行初始化.并传递给包含 Action 和 页面中直接使用.使用时通过 RequestContex ...

  6. Reso | The Linux Command Line 的中文版

    http://book.haoduoshipin.com/tlcl/book/zh/ 本书是 The Linux Command Line 的中文版, 为大家提供了多种不同的阅读方式. 中英文双语版- ...

  7. GDB调试技巧

    1. 查看内存分布 (gdb) info proc mappings 2. 对于类的调试,先通过行号来设断点, 比如:(gdb) b TcpConnection.cc:63 3. 打印数组的内容 (g ...

  8. 基于laravel4.2的相关架构设计

    项目组不久前引进了laravel框架,本人参与了laravel的调研和项目架构设计.个人认为项目架构中基于laravel的有些设计还是比较实用和有借鉴性的,现将一些设计分享给大家,希望能和大家共同学习 ...

  9. dedecms 使noflag参数及其过滤多个属性的修改方法

    noflag='h' 是代表不包含头条属性的意思,其中flag就是属性, 自定义属性值:头条[h]推荐[c]图片[p]幻灯[f]滚动[s]跳转[j]图文[a]加粗[b]. noflag过滤多个属性的修 ...

  10. StringBuilder - new line.

    //use this to implement platform-cross new-line. StringBuilder sb = new StringBuilder(); sb.append(S ...