学以致用

focus on Python , C++, and some interest in Go and R

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

随着国际化的需求越来越多,在考虑多语言的同时也不可避免的要涉及到多时区的问题。
python中对多语言也就是I18N的支持要好很多,但在多时区的处理上就稍微差一些,python标准库中虽然在datetime提供了tzinfo ,但很可惜只是一个abstract class,用户需要自己实现tzinfo。要实现local timezone的话可以借助time模块的time.timezone来实现,但还是比较繁琐。很奇怪的是,python标准库中为何不提供一个local timezone?更令人费解的是python的datetime的strptime方法却不支持带时区的时间字符串的解析。就目前的情况来看,如果想在不依赖于第三方开发包或者自己实现相关解析代码的情况下,只能寄希望于python 3.X了,至少在python2.7.2的标准库中还没有看到很好解决方式。
就目前而来,要想妥善的解决python中的多时区问题的话,最好是采用 python-dateutil 和 pytz,两个开发包各有千秋吧,但python-dateutil中的parser是pytz所短缺的,在解析时间串的时候很好用。
以下是一个简单的代码示例,用于展示如何采用python-dateutil来完成带时区字符串的解析,以及怎么借助datetime来输出带时区标识的时间串:

# -*- encoding: utf-8 -*-

import datetime
import time
import dateutil
from dateutil.parser import parse

def test_format():
    print "test time format with timezone"
    fmt = '%Y-%m-%d %H:%M:%S %z'
    now = datetime.datetime.now()
    print now.strftime(fmt)
    now = datetime.datetime.now(dateutil.tz.tzlocal())
    now_str = now.strftime(fmt)

    print "now is: "
    print now_str
    print "utcnow is: "
    print datetime.datetime.utcnow()


    datestr = "2011-06-02 14:00:01+07"
    dt = parse(datestr)
    print "Original datetime ", dt.strftime(fmt)
    print "Local datetime ", dt.astimezone(dateutil.tz.tzlocal()) 

 上述代码运行结果如下:
>>>
test time format with timezone
2011-12-01 19:15:27
now is:
2011-12-01 19:15:27 +0800
utcnow is:
2011-12-01 11:15:27.745000
Original datetime  2011-06-02 14:00:01 +0700
Local datetime  2011-06-02 15:00:01+08:00
>>>

需要注意的是,在安装python-dateutil时要根据python版本选择合适的python-dateutil版本,目前而言,python2.X需要选择python-dateutil 1.5, python-dateutil 2.0是针对python3.X的,不能在python2.X上使用

附录:

python-dateutil 下载地址:http://labix.org/python-dateutil
pytz 下载地址:http://pytz.sourceforge.net/


posted on 2011-12-01 19:19  Jerry.Kwan  阅读(3450)  评论(0编辑  收藏  举报