- 1、本文档共3页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Django的timezone应用心得
2014/10/30 Dj ango的timezone应用心得
Django的timezone应用心得
自从Django1.4开始, django之中就开始使用timezone这个玩意了, 换成中文, 就是时区的意思.
中国地区幅员辽阔, 按照15度一个时区计算,中国横跨5个时区, 但是实际上我们使用的是北京时间的东八区时间,
就是在国际标准时间的基础上, 早了8个小时. 也就是说北京这边看到日出了, 8小时后位于英国的国际标准时间起
点的位置才能看到日出.
django既然开始用这个时区了, 那我们也要跟上啊. 结果就是出现了很多意想不到的错误.
# 1. 大量的 RuntimeWarning: DateTimeField received a naive datetime (YYYY-MM-DD HH:MM:SS) while time
zone support is active
这 种情况就是你的settings.py 中的 USE_TZ True 了, 一旦你设置了这个地方, 你的噩梦就开始了.哈哈, 如果为
了眼不见心不烦, 你可以将它设置为False: USE_TZ False, 这样, django1.4 中出现的timezone你完全不必理会,
还是按照你以前的设置来运行程序.
#2. now.date()居然是昨天, 或者明天.
实际上, 确实会遇到这种问题.
举个实例来说吧:
有 新闻(news)模块, News model有个字段为 pub_date, 然后, 你设置客户端访问该条新闻的url为
/news/2013/08/23/ 10086/ 就是按照 /新闻/年/月/ 日/ ID/ 的方式编排, 结果你发现:
/news/2013/08/23/ 10086/ 居然是404, 找不到这个新闻, 到数据库中一看, 实际上是存在这条
新闻的, 但是为什么就是看不到这个新闻呢?
经过看文档和django源码, 我终于找到了原因:
先看News model的简单定义:
class News(models.Model):
title models.CharField(max_length 200)
pub_date models.DateTimeField(date published,blank True,default timezone.now)
content models.TextField()
def get_absolute_url(self):
return /news/%s/%d/ % (self.pub_date.strftime(%Y/%m/%d).lower (), self.pk)
1. 可以看到, pub_date我已经让它默认使用django的timezone.now 函数来获取默认时间了(这个时间是支持
timezone的, 这个timezone的值, 就是 settings.py 中定义的 TIME_ZONE Asia/Shanghai (中国只有2个时区字
符串, 一个是上海Asia/Shanghai, 一个是重庆Asia/Chongqing, 以前的政府所在地, 千万不要用北京, 这个在国
际标准中是不存在的)
2. 那么self.pub_date应该是django 中的aware_time了, 那么这个self.pub_date 的date 为啥不对, 导致找不到这条
新闻呢?原因后来我终于发现了, django 在存储 self.pub_date到数据库的时候, 好像是保存为 UTC 时区的, 也就
是说这个self.pub_date和你的服务器项目的settings.py 中设置好的时区 Asia/Shanghai 是不一样的, 也就是说,
最后得到的date可能不是同一天. 所以
self.pub_date.strftime(%Y/%m/%d) 获得的日期的表示, 可能不是你的时区的日期, 而是UTC时区的日期
http://www .360/content/13/1113/14/8504707_328895542.shtml
文档评论(0)