http://smilejay.com/2014/06/django-datetimefield-timezone-issue/
最近开始使用Django开发一些系统,在models.py中设置一些数据库表结构并给日期时间字段赋初值,不过在使用的过程中,遇到一点问题。问题是,我本来服务器使用的市区是“Asia/Shanghai”(+08:00),然后用datetime.now保存到数据库中时,里面的时间总是比我的系统时间相差8小时(感觉是UTC时间),但是我也查看了MySQL数据库中的时区是“+08:00”的(在MySQL中“SET GLOBAL time_zone = ‘+08:00′;”语句可以设置时区)。这到底是什么原因呢?今天还花了不少时间来弄清楚这个问题。
我在models.py中定义的一个类如下(对于数据库中一张表):
View Code PYTHON
1
2
3
4
5
6
7
8
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)
这里的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的时间,翻看它的实现就一下明白了,如下:
View Code PYTHON
1
2
3
4
5
6
7
8
9
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()
另外,如果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/#usag
分享到:
相关推荐
- **解决方案**:确保在视图中使用`object.all()`方法获取所有对象,而不是仅执行查询。 - **代码示例**: ```python students = Student.objects.all() for student in students: # do something with each ...
解决这类问题的方法是始终使用 `django.utils.timezone.now()` 来获取当前时间,或者在处理naive时间时明确地指定时区。在保存到数据库之前,确保时间对象是时区感知的,以避免出现不一致的情况。 总的来说,理解和...
通过整合多种技术手段,如MQTT协议、MySQL数据库、微信小程序等,为用户提供一个直观且易于操作的物联网解决方案。 #### 技术选型与架构设计 1. **后端技术栈**: - **Django框架**:作为后端主要框架,负责业务...
为了让 Web 应用能够适应不同地区和语言环境的需求,Django 提供了一整套国际化和本地化的解决方案。这部分内容覆盖了如何设置时区、日期格式、货币符号等方面的知识点,并且还包括了如何翻译文本字符串到多种语言的...
7. 国际化和本地化:Django支持国际化和本地化,这意味着可以很容易地将Web应用翻译成不同的语言,并且支持不同的时区设置,非常有利于开发全球化的应用程序。 Django框架的快速学习与掌握,需要对Python基础有一定...
Django作为一个高级的Python Web框架,支持全球不同地区的开发者进行项目开发。...通过正确配置和合理使用Django提供的时区工具,可以有效地解决跨时区应用开发中遇到的问题,保证应用的准确性和可靠性。
- 在线社区和论坛如Stack Overflow、Reddit中有很多经验和解决方案。 - 可以通过阅读源码和参考优秀的开源项目来提高Django开发水平。 10. Django最佳实践 - 遵循DRY原则,减少代码重复。 - 使用版本控制系统如...
### Django全面总结资料 ... - 针对常见的错误给出解决方法和建议。 通过以上内容,我们可以看到Django框架的强大功能及其在Web开发中的广泛应用。掌握这些知识点,可以帮助开发者更高效地开发高质量的应用程序。
通过上述知识点,我们可以看出Django的强大之处,它为Web开发提供了一站式的解决方案,从数据模型到用户界面,从URL路由到错误处理,都有一套完整的工具和最佳实践。在实际项目中,掌握这些核心概念将帮助你更高效地...
在Django这个强大的Python Web...无论你是构建一个简单的日历应用,还是需要复杂的时间数据管理,Django都能提供高效、直观的解决方案。在实践中,了解并熟练掌握这些组件,将极大地提升你的Django开发效率和代码质量。
在使用Django开发Web应用时,时间的处理和显示是一个重要的方面,特别是在涉及到多地区用户或者需要正确同步服务器和客户端...在实际开发中,遇到类似问题时,参照Django的官方文档和社区资源,往往能找到解决方案。
- **兼容性问题**: 从 Python 2 迁移到 Python 3 可能遇到的问题及解决办法。 - **迁移工具**: 使用 `2to3` 工具和其他工具辅助迁移过程。 **3.20 安全特性** - **输入验证**: 如何避免 SQL 注入等常见安全漏洞。 ...
它提供了一个完整的解决方案,包括数据库管理、表单处理、用户认证、URL路由、中间件等。 2. Django 1.5.2 特性: - **自定义用户模型**:在1.5版本中,Django引入了自定义用户模型的功能,允许开发者根据项目需求...
- **特性**:Django提供了高度抽象的通用Web开发模式,支持快速解决问题的方法,以及明确的约定来指导开发者如何解决问题。同时,它也留有足够的空间让用户可以根据具体需求进行定制。 #### 二、DjangoBook2.0中文...
- **Django的设计理念**:强调了Django通过提供高度抽象化的Web开发模式、快速解决问题的方法以及明确的解决方案,使得开发者可以专注于应用的核心逻辑。 ### 第二章:入门 - **安装与配置**:讲解了Django的安装...
通过理解这些解决方法和注意事项,你可以更好地应对Django连接数据库时遇到的1045错误,同时也能避免因时区问题导致的查询差异。在开发过程中,确保数据库设置正确、权限充足,并对时区处理有清晰的理解,能有效提高...
标签“Python库”说明这个软件包是一个Python编程语言的库,通常包含一组功能,用于扩展Python的功能或者提供特定领域的解决方案。 从“压缩包子文件的文件名称列表”看,只有一个文件名:django-tempus-dominus-...
### Djangoxadmin安装教程与问题解决方案 #### 一、安装教程 **1. xadmin下载** - **源码包下载地址**:通过提供的链接(https://github.com/sshwsfc/xadmin/tree/django2),可以下载到xadmin的最新版本。 **...