django 中timezone的处理

http://www.cnblogs.com/c9com/archive/2012/06/06/2507912.html 中说了django中fromtimestamp的一个奇怪问题,我试了试,我本地没这问题,后来看到后面写到是因为重庆时区变更导致得,就翻了下django代码,想看看django是怎么处理时区得。

我们在settings文件中加入, TIME_ZONE='Asia/Shanghai', 就可以用上海本地时间了

一般我们自己很少去管理django中得时区,都是django帮我们弄好了。搜索了下代码,发现在 utils/timezone.py文件中函数get_default_timezone

def get_default_timezone():
    """
    Returns the default time zone as a tzinfo instance.

    This is the time zone defined by settings.TIME_ZONE.

    See also :func:`get_current_timezone`.
    """
    global _localtime
    if _localtime is None:
        if isinstance(settings.TIME_ZONE, basestring) and pytz is not None:
            _localtime = pytz.timezone(settings.TIME_ZONE)
        else:
            _localtime = LocalTimezone()
    return _localtime

原来django 是用了一个叫pytz得东西来管理时区得, 到pytz代码下搜索timezone发现

def timezone(zone):
zone = _unmunge_zone(zone)
    if zone not in _tzinfo_cache:
        if zone in all_timezones_set:
            fp = open_resource(zone)
            try:
                _tzinfo_cache[zone] = build_tzinfo(zone, fp)
            finally:
                fp.close()
        else:
            raise UnknownTimeZoneError(zone)

    return _tzinfo_cache[zone]

open_resource功能是读取zoneinfo文件夹下对应文件,不过这些文件都是二进制,实在看不出来什么,追踪也就到此为止了。

通过看代码,能知道很多原来不知道得东西。比如pytz这个东西,原来使用datetime时老是搞不清楚tzinfo这个东西,这次之后就都明白了,而且pytz又变成了我以后可用得工具,不错。以前代码量比较少,最近要多看代码,多写代码。


######################################################

2013.03.29

最近一个项目使用mongodb作为数据库,mongodb里存的数据就是UTC+0的时间,但他并,没有保存时区信息,只是在保存数据时,如果时间有时区,就转成UTC时间然后保存,如果没有时区信息,就默认为是UTC时间直接保存。为了编程方便和避免错误,我把django的TIME_ZONE设为‘Africa/Accra' (UTC+0), 但页面上还是需要根据本地环境来设置时间的,不过django这些都还不错,基本不用自己来做: https://docs.djangoproject.com/en/dev/topics/i18n/timezones/#selecting-the-current-time-zone

另外,稍微修改了下从mongodb读取时间类型的代码,使得带上时区,这样在后端处理的时候就很方便了


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值