如何使用pytz模块进行Python时区转换操作?

2026-06-11 06:551阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1004个文字,预计阅读时间需要5分钟。

如何使用pytz模块进行Python时区转换操作?

pytz模块主要用于时区转换,常与datetime模块配合使用。datetime生成的时间对象没有时区信息,而time和datetime等都有时区概念,即通过tzinfo信息指定。

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方法来处理,如下所示:

如何使用pytz模块进行Python时区转换操作?

  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的方式来实现。

本文共计1004个文字,预计阅读时间需要5分钟。

如何使用pytz模块进行Python时区转换操作?

pytz模块主要用于时区转换,常与datetime模块配合使用。datetime生成的时间对象没有时区信息,而time和datetime等都有时区概念,即通过tzinfo信息指定。

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方法来处理,如下所示:

如何使用pytz模块进行Python时区转换操作?

  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的方式来实现。