查看文章 |
关于pytz的一些记录
2009-02-21 15:37
如果你的程序要考虑时区,可以使用pytz。datetime模块中有tzinfo相关的东西,但是它是一个抽象类,文档上说: tzinfo is an abstract base clase, meaning that this class should not be instantiated directly. You need to derive a concrete subclass, and (at least) supply implementations of the standard tzinfo methods needed by the datetime methods you use. The datetime module does not supply any concrete subclasses of tzinfo. 上面是说tzinfo是一个抽象类,不应该被直接实例化。你需要派生子类,提供相应的标准方法。datetime模块并不提供tzinfo的任何子类。 所以你可能会使用pytz这个模块。通过easy_install可以安装。目前它的最新文档在这里。 关于时区使用的几点想法: 1. 如果你的网站可能有来自其它时区的,可能你要考虑这个问题。都是一个地区的话,还要看服务器是否与用户在一个地区,如果不在,也要考虑。 2. 因此,基本上要考虑服务器时区与用户时区。服务器时区可以配置在系统中,全局生效。而用户时区则与用户相关,可以由用户自已进行设置。 3. 在生成相关时间对象时要加入时区的信息,并在输出时进行合适的转换。 而pytz提供了创建某个时区对象的方法,如,中国时区: >>> import pytz >>> pytz.country_timezones('cn') ['Asia/Shanghai', 'Asia/Harbin', 'Asia/Chongqing', 'Asia/Urumqi', 'Asia/Kashgar'] 可以看到,中国的时区可能有:'Asia/Shanghai', 'Asia/Harbin', 'Asia/Chongqing',最后两个不知道是什么。我们可能使用的'Asia/Shanghai'比较多。 因此可以创建一个时区对象: >>> tz = pytz.timezone('Asia/Shanghai') 然后在创建时间对象时进行指定: >>> import datetime >>> datetime.datetime.now(tz) datetime.datetime(2009, 2, 21, 15, 12, 33, 906000, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>) >>> datetime.datetime(2009, 2, 21, 15, 12, 33, tzinfo=tz) datetime.datetime(2009, 2, 21, 15, 12, 33, tzinfo=<DstTzInfo 'Asia/Shanghai' LMT+8:06:00 STD>) >>> datetime.date(2009, 2, 21, tzinfo=tz) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'tzinfo' is an invalid keyword argument for this function >>> datetime.time(15, 12, 33, tzinfo=tz) datetime.time(15, 12, 33, tzinfo=<DstTzInfo 'Asia/Shanghai' LMT+8:06:00 STD>) 从上面可以看出now(), datetime(), time()都是可以指定tzinfo信息的,而date是不行的,不知道为什么。所以最好的方法是内部使用datetime对象,需要时进行时区转换,然后再输出。 时区转换: >>> utc = pytz.utc >>> n = datetime.datetime.now(tz) >>> n datetime.datetime(2009, 2, 21, 15, 16, 41, 843000, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>) >>> new = n.astimezone(utc) >>> new datetime.datetime(2009, 2, 21, 7, 16, 41, 843000, tzinfo=<UTC>) >>> utc.normalize(n.astimezone(utc)) datetime.datetime(2009, 2, 21, 7, 16, 41, 843000, tzinfo=<UTC>) utc是世界标准时间。 上面的代码通过astimezone(utc)将中国时间转为utc标准时间,可以看到不同的时区时间已经不一样了。不过在pytz的文档上说: Converting between timezones also needs special attention. This also needs to use the normalize method to ensure the conversion is correct. 要注意什么呢?是 daylight savings time,中文叫日光节约时间或夏令时。对于有采用了夏时制的要使用normzlize来处理,不采用的,直接使用astimezone来处理。所以在通常情况下使用astimezone()就足够了。 另外pytz还提供了全部的timezone信息,如: >>> from pytz import all_timezones >>> len(all_timezones) 559 >>> from pytz import common_timezones >>> len(common_timezones) 393 可以看到有很多。 |
最近读者: