本文共 1930 字,大约阅读时间需要 6 分钟。
最近用python写一份darwin的读日志脚本。darwin服务器记录的是GMT(格林威治时间)。按照北京时间来算需要+8小时。但是自己转换程序写起来太麻烦,需要判断是否过了一天,是否过了一个月,是否过了一年。更悲剧的是需要判断润年。。。。
自己搜索了一下,大概有两种方法:写一个tzinfo的子类,或者用pytz模块来解决。
相比与后者前者实在是有点麻烦。。。我也懒得看,直接用第二种。
首先需要在程序里引入两个模块:
import datetime
import pytz (PS:这个模块需要另外下载,下载方法见附录)
包含模块后可以使用pytz和datetime类的一些方法。其中datetime用于时区转换,pytz用于产生一个时区(timezone)对象,在转换时区的时候会用到。
命令行下如果输入:
pytz.country_timezones('cn') 则会返回: (这个命令可以望文生义啊,很好懂。。。)
['Asia/Shanghai', 'Asia/Harbin', 'Asia/Chongqing', 'Asia/Urumqi', 'Asia/Kashgar']
不难发现,这一句命令其实返回了中国的时区(-_-!我不得不涂槽居然没有beijing。。。。。)
其中urumqi是乌鲁木齐,kashgar是喀什。
接下来,我们可以创建一个时区对象:
tz=pytz.timezone('Asia/Shanghai')
这东西在时区转换的时候要用到。因为你必须告诉datetime你要转到具体哪个时区。
GMT标准时区对象可以这样得到:
utc=pytz.utc, 这里utc就是世界标准时间。
如果是想使用北京时区,用上海时区可以勉强替代。但是这里还是有bug。。。。。因为上海时间跟北京时间莫名其妙差了6分钟。。。。。。
一般解决方法就是。。。。改成这样子。。。:
tz=pytz.timezone('Asia/Taipei')
你没看错。。。就是台北。。。别问我为啥台北不算中国的。。。
第二步,创建一个时间对象。可以从系统获取当前时间,当然需要指定时区。如下:
dt=datetime.datetime.now(tz)
这时候返回一个datetime.datetime对象。
也可以自己指定时间。如下:
dt=datetime.datetime(2013,06,28,20,37,12,tzinfo=tz)
它的格式就是年月日时分秒外加时区对象。要注意的是,年月日时分秒必须用int类型给出。
同时,还可以只指定日期或者时间,如下:
dt=datetime.date(2013,06,28,tzinfo=tz)
or
dt=datetime.time(20,37,12,tzinfo=tz)
注意这里得到的dt都不是strting类型的,而是datetime.datetime对象。
最后一步进行时区转换,我们将台北时间转换为世界时间:
GMT=dt.astimezone(utc)
至此转换完成。当然如果想把GMT转换为台北时间就这么写:
Taipei=GMT.astimezone(tz) tz即上面定义的台北时区对象。
当然,如果单纯的想要输出时间,只要简单地print对象:
print GMT
如果想把时间换成字符转作进一步处理,则可以用strftime()方法。在strftime方法中需要指明输出格式。比如:
my_date=Taipei.strftime("%Y-%m-%d %H:%M:%S")
print my_date
此时输出:
2013-06-28 20:37:12
my_date已经是一个字符串了,可以用它作进一步处理。
顺便说一句,括号中的格式也是望文生义的,y即year,依次类推。而且格式可以随便你自己指派,你可以不加符号“-”,写作:
my_date=Taipei.strftime("%Y%m%d %H:%M:%S")
print my_date
那么会直接输出:
20130628 20:37:12
附录:
pytz模块的安装。
先安装easy_install。在终端输入:
sudo apt-get install python-setuptools
然后使用axel下载pytz包:
sudo apt-get install axel
axel http://pypi.python.org/packages/2.7/p/pytz/pytz-2012h-py2.7.egg
即可然后执行命令
sudo easy_install pytz-2012h-py2.7.egg
就完成了。转载地址:http://rgwub.baihongyu.com/