zoukankan      html  css  js  c++  java
  • 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的方式来实现。

  • 相关阅读:
    网页加速的14条优化法则 网站开发与优化
    .NET在后置代码中输入JS提示语句(背景不会变白)
    C语言变量声明内存分配
    SQL Server Hosting Toolkit
    An established connection was aborted by the software in your host machine
    C语言程序设计 2009春季考试时间和地点
    C语言程序设计 函数递归调用示例
    让.Net 程序脱离.net framework框架运行
    C语言程序设计 答疑安排(2009春季 110周) 有变动
    软件测试技术,软件项目管理 实验时间安排 2009春季
  • 原文地址:https://www.cnblogs.com/yangzhixue/p/11616797.html
Copyright © 2011-2022 走看看