博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python的时区处理
阅读量:2189 次
发布时间:2019-05-02

本文共 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/

你可能感兴趣的文章
Leetcode C++《每日一题》20200626 338. 比特位计数
查看>>
Leetcode C++ 《拓扑排序-1》20200626 207.课程表
查看>>
Go语言学习Part1:包、变量和函数
查看>>
Go语言学习Part2:流程控制语句:for、if、else、switch 和 defer
查看>>
Go语言学习Part3:struct、slice和映射
查看>>
Go语言学习Part4-1:方法和接口
查看>>
Leetcode Go 《精选TOP面试题》20200628 69.x的平方根
查看>>
leetcode 130. Surrounded Regions
查看>>
【Python】详解Python多线程Selenium跨浏览器测试
查看>>
Jmeter之参数化
查看>>
Shell 和Python的区别。
查看>>
Python 列表(list)、字典(dict)、字符串(string)常用基本操作小结
查看>>
Loadrunner之https协议录制回放报错如何解决?(九)
查看>>
python中xrange和range的异同
查看>>
列表、元组、集合、字典
查看>>
【Python】easygui小甲鱼
查看>>
【Python】关于Python多线程的一篇文章转载
查看>>
【Pyton】【小甲鱼】文件
查看>>
【Pyton】【小甲鱼】永久存储:腌制一缸美味的泡菜
查看>>
【Pyton】【小甲鱼】异常处理:你不可能总是对的
查看>>