python模块-pytz时区转换

pytz模块常用于时区的转换,常常配合datetime一起使用。我们知道datetime除了data方法生成的时间是没有时区概念,其他如time、datetime等都是有时区概念,即指定了tzinfo信息。>>> import datetime

  1. >>> datetime.datetime.now(tz)

  2.  

    datetime.datetime(2009, 2, 21, 15, 12, 33, 906000, tzinfo=<DstTzInfo ‘Asia/Shanghai‘ CST+8:00:00 STD>)

  3.  

    >>> datetime.datetime(2009, 2, 21, 15, 12, 33, tzinfo=tz)

  4.  

    datetime.datetime(2009, 2, 21, 15, 12, 33, tzinfo=<DstTzInfo ‘Asia/Shanghai‘ LMT+8:06:00 STD>)

  5.  

    >>> datetime.date(2009, 2, 21, tzinfo=tz)

  6.  

    Traceback (most recent call last):

  7.  

    File "<stdin>", line 1, in <module>

  8.  

    TypeError: ‘tzinfo‘ is an invalid keyword argument for this function

  9.  

    >>> datetime.time(15, 12, 33, tzinfo=tz)

  10.  

    datetime.time(15, 12, 33, tzinfo=<DstTzInfo ‘Asia/Shanghai‘ LMT+8:06:00 STD>)

时区转换

  • pytz.country_timezones(‘国家代码’):此方法可以拿到某个国家的时区名列表。
  1. >>>(pytz.country_timezones(‘cn‘)

  2.  

    [‘Asia/Shanghai‘, ‘Asia/Urumqi‘]

  • pytz.timezone(‘时区名’):此方法能获取一个tzinfo对象,该对象可在datetime生成时间中以参数的形式放入,即可生成对应时区的时间。
  1. >>>utc = pytz.timezone(‘UTC‘)

  2.  

    >>>datetime.datetime.now(tz=utc)

  3.  

    2019-05-10 10:53:46.000929+00:00

实际上,现在时间为18:53:46

  • 查看有哪些时区

pytz有all_timezones、common_timezones这两个属性来查看有哪些时区。

from pytz import all_timezones,common_timezones
  • 时间按时区转换

这要用到datetime模块的astimezone方法来实现。如下所示,开始生成本地时间,然后在转成utc时间。

  1. import datetime

  2.  

    import pytz

  3.  

    utc = pytz.timezone(‘UTC‘)

  4.  

    now_time = datetime.datetime.now()

  5.  

    utc_time = now_time.astimezone(tz=utc)

  6.  

    print(now_time,utc_time)

2019-05-10 19:02:53.499513 2019-05-10 11:02:53.499513+00:00

对于有采用了夏时制的要使用时区对象的normzlize方法来处理,如下所示:

  1. import datetime

  2.  

    import pytz

  3.  

    utc = pytz.timezone(‘UTC‘)

  4.  

    now_time = datetime.datetime.now()

  5.  

    utc_time = utc.normalize(now_time.astimezone(tz=utc))

  6.  

    print(now_time,utc_time)

2019-05-10 19:08:25.286690 2019-05-10 11:08:25.286690+00:00
  • LMT问题

LMT,这是Local Mean Time的缩写,网上查一查意思是本地平均时。而且时间是+8:06,说明与UTC的时差不是8个小时整。下面有一个问题是,当我们用pytz.timezone(‘Asia/Shanghai‘) 生成的时区是LMT,而非标准的CST(就是Central Standard Time的意思)。那么这会造成什么后果呢?下面来展示下:

  1. >>>tz = pytz.timezone(‘Asia/Shanghai‘)

  2.  

    >>>tz

  3.  

    <DstTzInfo ‘Asia/Shanghai‘ LMT+8:06:00 STD>

  4.  

    >>>d = datetime.datetime(2019,5,10,19,12,30,tzinfo=tz)

  5.  

    >>>d

  6.  

    datetime.datetime(2019, 5, 10, 19, 12, 30, tzinfo=<DstTzInfo ‘Asia/Shanghai‘ LMT+8:06:00 STD>)

  7.  

    >>>d = d.astimezone(utc)

  8.  

    >>>d

  9.  

    datetime.datetime(2019, 5, 10, 11, 6, 30, tzinfo=<UTC>)

  10.  

    >>>d.astimezone(tz)

  11.  

    datetime.datetime(2019, 5, 10, 19, 6, 30, tzinfo=<DstTzInfo ‘Asia/Shanghai‘ CST+8:00:00 STD>)

由上述可以发现,刚开始由datetime.datetime()生成的时间是LMT,接下来我将其转换为UTC时区的时间,最后又转回来,我们可以发现,现在的时间又变成了CST标准。而这两个标准,就直接导致其相差了6分钟。

下面我们可以用时区对象的localize方法,将LMT准换为CST,使其统一。

  1. >>>datetime.datetime(2019,5,10,20,30,32,tzinfo=tz)

  2.  

    datetime.datetime(2019, 5, 10, 20, 30, 32, tzinfo=<DstTzInfo ‘Asia/Shanghai‘ LMT+8:06:00 STD>)

  3.  

    >>>tz.localize(datetime.datetime(2019,5,10,20,30,32))

  4.  

    datetime.datetime(2019, 5, 10, 20, 30, 32, tzinfo=<DstTzInfo ‘Asia/Shanghai‘ CST+8:00:00 STD>)

所以我的建议是生成带时区的时间时,一定要使用timezone.localize()来生成。不要在时间对象的构造函数中传入tzinfo的方式来实现。

原文地址:https://www.cnblogs.com/yangzhixue/p/11616797.html

时间: 2024-11-02 05:35:53

python模块-pytz时区转换的相关文章

datetime时区转换

http://www.dannysite.com/blog/122/ Python标准库中的datetime模块提供了各种对日期和时间的处理方法.从本文的主题着手,首先利用datetime中提供的utcnow()方法获取到当前UTC时间: 1 2 3 4 >>> import datetime >>> utc_now = datetime.datetime.utcnow() >>> utc_now datetime.datetime(2013, 12,

python模块part3

一:内建模块 time和datetime 在Python中,通常有这几种方式来表示时间:1)时间戳 2)格式化的时间字符串 3)元组(struct_time)共九个元素.由于Python的time模块实现主要调用C库,所以各个平台可能有所不同. UTC(Coordinated Universal Time,世界协调时)亦即格林威治天文时间,世界标准时间.在中国为UTC+8.DST(Daylight Saving Time)即夏令时. 时间戳(timestamp)的方式:通常来说,时间戳表示的是从

python模块详解(一)

Python的模块在其它语言中通常称为库或类库,也就是lib.它是编程语言的第三级封装,第四级则是包,也就是模块的打包组合,而前两级分别是函数和类.封装的好处,自然不用多言,高内聚,松耦合,减少代码重复.同时,模块也是“轮子”的代表,大多数是前人已经实现并测试好的高效代码组合,它的存在使得我们不必重复“造轮子”,可以使用拿来主义.但是,个人认为一个合格的程序员,虽然不会去重复造轮子,但必须要具备造轮子的能力,至少你要看得懂他人造的轮子. python模块的种类 在python中,通常是这样的,许

python-学习笔记之-Day5 双层装饰器 字符串格式化 python模块 递归 生成器 迭代器 序列化

1.双层装饰器 #!/usr/bin/env python # -*- coding: utf-8 -*- # author:zml LOGIN_INFO = False IS_ADMIN = False   def check_log(func): def inner(): res = func() if LOGIN_INFO: print('验证成功!') return res else: print('验证失败!') return inner   def check_admin(func)

Python 模块学习

模块学习: http://wsyht90.blog.51cto.com/9014030/1845737 1.getpass 2.os 3.sys 4.subprocess 5.hashlib 6.json 7.pickle 8.shutil 9.time 10.datetime 11.re 12.random 13.configparser 14.traceback 15.yaml 16.itertools 17.logging 18.urllib.urllib2 19.paramiko ###

python 学习第五天,python模块

一,Python的模块导入 1,在写python的模块导入之前,先来讲一些Python中的概念性的问题 (1)模块:用来从逻辑上组织Python代码(变量,函数,类,逻辑:实现一个功能),本质是.py结尾的python文件(文件名:test.py,对应的模块名:test) (2)包:用来从逻辑上组织模块的,本质就是一个目录(必须带有一个__init__.py文件) 2,导入的方法 (1)import module_name导入某个模块 (2)import module_name,module2_

python模块(json和pickle模块)

json和pickle模块,两个都是用于序列化的模块 • json模块,用于字符串与python数据类型之间的转换 • pickle模块,用于python特有类型与python数据类型之间的转换 两个模块,都提供了dumps,dump,loads,load 4个功能 1 import json 2 s = '{"key1":"value1","key2":"value2"}' # ==> 用json模块将字符串转化成其他

python安装环境配置、python模块添加、sublime text编辑器配置

本文讲述的是  windows环境 python相应的安装配置. 第一步,进入官网找安装包,官网地址如下:https://www.python.org/downloads/ 找到相应2.7.x或3.x版本下载,注意请一定要确认需求是2.7或是3.x的,python这两个版本之间库相差很大. 这里假设你安装的地址为 D:\python,以下为详细的配置步骤: 1.点击进入我的电脑 2.选取系统属性,如图 3.点击高级系统设置,如图 4.点击环境变量按钮,找到系统变量栏里的Path变量,双击,添加以

python模块(六)

模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需要多个函数才能完成(函数又可以在不同的.py文件中),n个 .py 文件组成的代码集合就称为模块. 如:os 是系统相关的模块:file是文件操作相关的模块 模块分为三种: 自定义模块 内置模块 开源模块 自定义模块 1.定义模块 情景一: 情景二: 情景三: 2.导入模块 Python之所以应用越来越广泛,在