Django和Python中的Timezone处理

在现实环境中,存在有多个时区。用户之间很有可能存在于不同的时区,并且许多国家都拥有自己的一套夏令时系统。所以如果网站面向的是多个时区用户,只以当前时间为标准开发,便会在时间计算上产生错误。

为解决这个此类问题,在代码和数据库中统一使用 UTC 时间,仅在与最终用户进行交互时使用本地时间是一个很好的办法 。
Django 默认关闭时区支持,开启时区支持,需要在 settings 中设置 USE_TZ = True 。

# TIME_ZONE = 'UTC'
TIME_ZONE = 'Asia/Shanghai'

最好同时安装 pytz 模块(pip install pytz) 。

Naive 和 Aware 类型的 datetime 对象

Python 的 datatime.datetime对象有一个 tzinfo 属性,该属性是 datetime.tzinfo 子类的一个实例,他被用来存储时区信息。当某个 datetime 对象的 tzinfo 属性被设置并给出一个时间偏移量时,我们称该 datetime 对象是 aware (已知) 的。否则称其为 naive (原生) 的。
可以使用 is_aware() 和 is_naive() 函数来判断某个 datetime 对象是 aware 类型或 naive 类型。

  • 当关闭时区时,django 使用原生的 datetime 对象保存本地时间:
 import datetime
now = datetime.datetime.now()
  • 当开启时区时,django 使用已知 (aware) 的 datetime 对象存储本地时间:
from django.utils import timezone
now = timezone.now()

而默认Django开启时区且为utc,所以在不改变TIME_ZONE的情况下,django数据库中的时间一定是timezone aware的时间,如果要生成时间,要通过replace timezone设置为本地时区。

数据库中的时间都是utc时间
Django中的timezone

from django.utils import timezone
     t=timezone.now()
     print(t)
datetime.datetime(2016, 1, 4, 2, 13, 54, 582231, tzinfo=<UTC>)
    new_t=timezone.localtime(t)
    print(new_t)
datetime.datetime(2016, 1, 4, 10, 13, 54, 582231, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>)

Python中的datetime

import datetime
    t = datetime.datetime.strptime("2016-1-4", "%Y-%m-%d")
    print(t)
datetime.datetime(2016, 1, 4, 0, 0)
    new_t = t.replace(tzinfo=(pytz.timezone('Asia/Shanghai')))
    print(new_t)
datetime.datetime(2016, 1, 4, 0, 0, tzinfo=<DstTzInfo 'Asia/Shanghai' LMT+8:06:00 STD>)

转载于:https://www.cnblogs.com/sunxiuwen/p/9960523.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值