Python时区的处理
发现python没有简单的处理时区的方法,不明白为什么Python不提供一个时区模块来处理时区问题。 好在我们有个第三方pytz模块,能够帮我们解决一下时区问题。
pytz简单教程
pytz查询某个的时区
可以根据国家代码查找这个国家的所有时区。
>>> import pytz
>>> pytz.country_timezones('cn')
['Asia/Shanghai', 'Asia/Harbin', 'Asia/Chongqing', 'Asia/Urumqi', 'Asia/Kashgar']
pytz创建时区对象
根据上面得到的时区信息,就可以创建指定的时区对象。比如创建上海时区对象:
tz = pytz.timezone('Asia/Shanghai')
得到某个时区的时间
然后在创建时间对象时进行指定上面时区,就可以得到指定时区的日期时间:
>>> import datetime
>>> datetime.datetime.now(tz)
二、获取本地时区的N种方法
第一种方法:
说到使用python来操作timezone,首先想到的肯定是win32timezone了。。。
我试着用win32timezone获取了一下,结果如下:
>>> from win32timezone import *
>>> now() datetime.datetime(2011, 4, 29, 17, 9, 24, 623000, tzinfo=TimeZoneInfo(u'China Standard Time', True))
>>> print now() 2011-04-29 17:09:27.154000+08:00
>>> print type(now()) <type 'datetime.datetime'>
>>> now().tzinfo TimeZoneInfo(u'China Standard Time', True)
>>> print now().tzinfo Unknown
>>> print type(now().tzinfo) <class 'win32timezone.TimeZoneInfo'>
打印的结果,可以看到: 使用函数,是可以得到结果,但是如果使用print之后,跟只使用函数是不同的,甚至打印win32timezone.now().tzinfo的结果却是Unknow。我看到各种函数的类型之后,发现,他们本身是个class型(我猜的),不是str型,所以打印出来的结果是不同的
所以使用win32timezone的方法看来行不通,因为程序写的长一点,是不可能用IDLE交互运行的。。。
注:如果在编写程序时提示"No module named 'win32timezone'" 则是没有导入模块
解决方法:from win32timezone import *
第二种方法:
后来我去看了timezone的函数原型,地址:%Python_Home%/Lib/site-packages/win32/lib/win32timezone.py
发现有一个函数是这么写的:
def _get_time_zone_key(subkey=None):
"Return the registry key that stores time zone details"
key = _RegKeyDict.open(_winreg.HKEY_LOCAL_MACHINE, TimeZoneInfo.tzRegKey)
if subkey:
key = key.subkey(subkey)
return key
所以,我发现,在python中获取time zone key的方法是从注册表中获取,因为用了'_winreg',所以,既然调用win32timezone无效,那么我也直接从注册表中获取。
TimeZone 的 位置为: [HKEY_CURRENT_USER/Software/Microsoft/Windows NT/CurrentVersion/Time Zones]
KeyName为: TimeZoneKeyName
所以我可以这么获取:
import _winreg key = _winreg.OpenKey(_winreg.HKEY_CURRENT_USER, r'Software/Microsoft/Windows NT/CurrentVersion/Time Zones')
value, type = _winreg.QueryValueEx(key, 'TimeZoneKeyName')
print value
#----Result:----#
>>> China Standard Time
所以用这种方法成功了。。。
废话一句,其实用注册表获得键值的方法很强大,一切跟win32相关的信息,都可以从注册表中获得,例如用户名之类的。。。
第三种方法:
今天无意闲看,发现了一个很简单的方法,例子:
>>> import time
>>> str = time.strftime('%Z', time.localtime())
>>> print str
China Standard Time