`
cooler1217
  • 浏览: 386061 次
  • 性别: Icon_minigender_1
  • 来自: 长春
社区版块
存档分类
最新评论

django 时区问题解决方案

 
阅读更多
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
分享到:
评论

相关推荐

    新人学习python的django框架常见问题总结

    - **解决方案**:确保在视图中使用`object.all()`方法获取所有对象,而不是仅执行查询。 - **代码示例**: ```python students = Student.objects.all() for student in students: # do something with each ...

    详解Django 时间与时区设置问题

    解决这类问题的方法是始终使用 `django.utils.timezone.now()` 来获取当前时间,或者在处理naive时间时明确地指定时区。在保存到数据库之前,确保时间对象是时区感知的,以避免出现不一致的情况。 总的来说,理解和...

    基于Django框架开发简单的物联网平台

    通过整合多种技术手段,如MQTT协议、MySQL数据库、微信小程序等,为用户提供一个直观且易于操作的物联网解决方案。 #### 技术选型与架构设计 1. **后端技术栈**: - **Django框架**:作为后端主要框架,负责业务...

    django1.11英文手册

    为了让 Web 应用能够适应不同地区和语言环境的需求,Django 提供了一整套国际化和本地化的解决方案。这部分内容覆盖了如何设置时区、日期格式、货币符号等方面的知识点,并且还包括了如何翻译文本字符串到多种语言的...

    Django学习笔记.pdf

    7. 国际化和本地化:Django支持国际化和本地化,这意味着可以很容易地将Web应用翻译成不同的语言,并且支持不同的时区设置,非常有利于开发全球化的应用程序。 Django框架的快速学习与掌握,需要对Python基础有一定...

    详解Django 中是否使用时区的区别

    Django作为一个高级的Python Web框架,支持全球不同地区的开发者进行项目开发。...通过正确配置和合理使用Django提供的时区工具,可以有效地解决跨时区应用开发中遇到的问题,保证应用的准确性和可靠性。

    Django项目的创建.md

    - 在线社区和论坛如Stack Overflow、Reddit中有很多经验和解决方案。 - 可以通过阅读源码和参考优秀的开源项目来提高Django开发水平。 10. Django最佳实践 - 遵循DRY原则,减少代码重复。 - 使用版本控制系统如...

    django 总结资料

    ### Django全面总结资料 ... - 针对常见的错误给出解决方法和建议。 通过以上内容,我们可以看到Django框架的强大功能及其在Web开发中的广泛应用。掌握这些知识点,可以帮助开发者更高效地开发高质量的应用程序。

    2024-Django平台开发-Django知识点(七)

    通过上述知识点,我们可以看出Django的强大之处,它为Web开发提供了一站式的解决方案,从数据模型到用户界面,从URL路由到错误处理,都有一套完整的工具和最佳实践。在实际项目中,掌握这些核心概念将帮助你更高效地...

    时间组件 django 自己看的

    在Django这个强大的Python Web...无论你是构建一个简单的日历应用,还是需要复杂的时间数据管理,Django都能提供高效、直观的解决方案。在实践中,了解并熟练掌握这些组件,将极大地提升你的Django开发效率和代码质量。

    关于Django显示时间你应该知道的一些问题

    在使用Django开发Web应用时,时间的处理和显示是一个重要的方面,特别是在涉及到多地区用户或者需要正确同步服务器和客户端...在实际开发中,遇到类似问题时,参照Django的官方文档和社区资源,往往能找到解决方案。

    django_v1.8.pdf

    - **兼容性问题**: 从 Python 2 迁移到 Python 3 可能遇到的问题及解决办法。 - **迁移工具**: 使用 `2to3` 工具和其他工具辅助迁移过程。 **3.20 安全特性** - **输入验证**: 如何避免 SQL 注入等常见安全漏洞。 ...

    Django-1.5.2.tar.gz

    它提供了一个完整的解决方案,包括数据库管理、表单处理、用户认证、URL路由、中间件等。 2. Django 1.5.2 特性: - **自定义用户模型**:在1.5版本中,Django引入了自定义用户模型的功能,允许开发者根据项目需求...

    DjangoBook2.0中文版

    - **特性**:Django提供了高度抽象的通用Web开发模式,支持快速解决问题的方法,以及明确的约定来指导开发者如何解决问题。同时,它也留有足够的空间让用户可以根据具体需求进行定制。 #### 二、DjangoBook2.0中文...

    The Django Book 2.0中文译本

    - **Django的设计理念**:强调了Django通过提供高度抽象化的Web开发模式、快速解决问题的方法以及明确的解决方案,使得开发者可以专注于应用的核心逻辑。 ### 第二章:入门 - **安装与配置**:讲解了Django的安装...

    django 连接数据库出现1045错误的解决方式

    通过理解这些解决方法和注意事项,你可以更好地应对Django连接数据库时遇到的1045错误,同时也能避免因时区问题导致的查询差异。在开发过程中,确保数据库设置正确、权限充足,并对时区处理有清晰的理解,能有效提高...

    PyPI 官网下载 | django-tempus-dominus-5.1.2.9.tar.gz

    标签“Python库”说明这个软件包是一个Python编程语言的库,通常包含一组功能,用于扩展Python的功能或者提供特定领域的解决方案。 从“压缩包子文件的文件名称列表”看,只有一个文件名:django-tempus-dominus-...

    Djangoxadmin安装教程与问题解决方案.docx

    ### Djangoxadmin安装教程与问题解决方案 #### 一、安装教程 **1. xadmin下载** - **源码包下载地址**:通过提供的链接(https://github.com/sshwsfc/xadmin/tree/django2),可以下载到xadmin的最新版本。 **...

Global site tag (gtag.js) - Google Analytics