如果你的程序要考虑时区,可以使用pytz。datetime模块中有tzinfo相关的东西,但是它是一个抽象类,文档上说:

tzinfo is an abstract base clase, meaning that this class should not be instantiated directly. You need to derive a concrete subclass, and (at least) supply implementations of the standard tzinfo methods needed by the datetime methods you use. The datetime module does not supply any concrete subclasses of tzinfo.

上面是说tzinfo是一个抽象类,不应该被直接实例化。你需要派生子类,提供相应的标准方法。datetime模块并不提供tzinfo的任何子类。

所以你可能会使用pytz这个模块。通过easy_install可以安装。目前它的最新文档在这里。

关于时区使用的几点想法:

1. 如果你的网站可能有来自其它时区的,可能你要考虑这个问题。都是一个地区的话,还要看服务器是否与用户在一个地区,如果不在,也要考虑。

2. 因此,基本上要考虑服务器时区与用户时区。服务器时区可以配置在系统中,全局生效。而用户时区则与用户相关,可以由用户自已进行设置。

3. 在生成相关时间对象时要加入时区的信息,并在输出时进行合适的转换。

而pytz提供了创建某个时区对象的方法,如,中国时区:

>>> import pytz

>>> pytz.country_timezones('cn')

['Asia/Shanghai', 'Asia/Harbin', 'Asia/Chongqing', 'Asia/Urumqi', 'Asia/Kashgar']

可以看到,中国的时区可能有:'Asia/Shanghai', 'Asia/Harbin', 'Asia/Chongqing',最后两个不知道是什么。我们可能使用的'Asia/Shanghai'比较多。

因此可以创建一个时区对象:

>>> tz = pytz.timezone('Asia/Shanghai')

然后在创建时间对象时进行指定:

>>> import datetime

>>> datetime.datetime.now(tz)

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

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

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

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

Traceback (most recent call last):

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

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

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

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

从上面可以看出now(), datetime(), time()都是可以指定tzinfo信息的,而date是不行的,不知道为什么。所以最好的方法是内部使用datetime对象,需要时进行时区转换,然后再输出。

时区转换:

>>> utc = pytz.utc

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

>>> n

datetime.datetime(2009, 2, 21, 15, 16, 41, 843000, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>)

>>> new = n.astimezone(utc)

>>> new

datetime.datetime(2009, 2, 21, 7, 16, 41, 843000, tzinfo=<UTC>)

>>> utc.normalize(n.astimezone(utc))

datetime.datetime(2009, 2, 21, 7, 16, 41, 843000, tzinfo=<UTC>)

utc是世界标准时间。

上面的代码通过astimezone(utc)将中国时间转为utc标准时间,可以看到不同的时区时间已经不一样了。不过在pytz的文档上说:

Converting between timezones also needs special attention. This also needs to use the normalize method to ensure the conversion is correct.

要注意什么呢?是 daylight savings time,中文叫日光节约时间或夏令时。对于有采用了夏时制的要使用normzlize来处理,不采用的,直接使用astimezone来处理。所以在通常情况下使用astimezone()就足够了。

另外pytz还提供了全部的timezone信息,如:

>>> from pytz import all_timezones

>>> len(all_timezones)

559

>>> from pytz import common_timezones

>>> len(common_timezones)

393

可以看到有很多。

在昨天与了关于pytz的东西后,还是发现一些问题。

>>> import pytz, datetime

>>> tz = pytz.timezone('Asia/Shanghai')

>>> tz

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

可以看到,它有一个LMT,这是Local Mean Time的缩写,网上查一查意思是本地平均时。而且时间是+8:06,说明与UTC的时差不是8个小时整。先不管它,让我们转换一下试试。

>>> d = datetime.datetime(2009,2,21,23,18,5,tzinfo=tz)

>>> d

datetime.datetime(2009, 2, 21, 23, 18, 5, tzinfo=<DstTzInfo 'Asia/Shanghai' LMT+8:06:00 STD>)

好,时区与tz是一样的,没什么。

>>> x = d.astimezone(pytz.utc)

>>> x

datetime.datetime(2009, 2, 21, 15, 12, 5, tzinfo=<UTC>)

我们转为了UTC时区,时间上有差异,没问题。

让我们再转回来。

>>> x.astimezone(tz)

datetime.datetime(2009, 2, 21, 23, 12, 5, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>)

奇怪,看到了吧,变成了CST了。时差也成了+8:00了。CST就是Central Standard Time的意思。但这样就造成了转换的不一致。我们应该使用CST标准才对。

让我们再看一下:

>>> datetime.datetime.now(tz)

datetime.datetime(2009, 2, 22, 11, 11, 2, 125000, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>)

>>> datetime.time(23, 18, 5, tzinfo=tz)

datetime.time(23, 18, 5, tzinfo=<DstTzInfo 'Asia/Shanghai' LMT+8:06:00 STD>)

可以看到now()函数得到的是CST的,而time传入tzinfo是LMT的。(date不支持tzinfo参数)所以我们要进行修订,怎么做,使用timezone对象的localize()方法,如:

>>> d = datetime.datetime(2009,2,21,23,18,5)

>>> tz.localize(d)

datetime.datetime(2009, 2, 21, 23, 18, 5, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>)

所以我才明白pytz的文档上说的:

Creating localtimes is also tricky, and the reason why working with local times is not recommended. Unfortunately, you cannot just pass a ‘tzinfo’ argument when constructing a datetime.

所以我的建议是生成带时区的时间时,一定要使用timezone.localize()来生成。不要在时间对象的构造函数中传入tzinfo的方式来实现,为些我封装了一些函数放在了uliweb/utils/date.py中。

另外关于北京时间。在pytz中,我无法找到Asia/Beijing和GMT+8这样的时区设置,但是有些时间转换的工具却有。按理说pytz使用的是标准的时区数据库,我特意下载了查看,的确是没有。

时区处理的确是挺麻烦的事。象有些数据库也支持这样的功能,如postgres支持set timezone的命令,这是在django中看到的。

转载于:https://my.oschina.net/wubiao239/blog/869700

pytz实现时区的转换相关推荐

  1. pytz 将date确定时区后转换成任意时区

    目录 0. goal 1. pytz 2. func 3. 实例 0. goal 将字符串类型的日期时间, 如 "2021-03-16 16:05:05" 确认为某一时区时间后,转 ...

  2. Python怎么进行时区的转换

    pytz 是一个用于处理时区的 Python 库,它为 Python 提供了对时区的支持. 它提供了大量的时区信息,包括时区名称.偏移量.是否使用夏令时等.你可以使用 pytz 库来处理本地时间.UT ...

  3. iOS开发时间戳与时间,时区的转换,汉字与UTF8,16进制的转换

    转自:http://blog.sina.com.cn/s/blog_68661bd80101njdo.html //获取当前系统的时间戳 +(long)getTimeSp{     long time ...

  4. java不同时区时间转换,Java在不同时区转换时间

    本文中,我们将展示如何在不同时区之间转换时间,我们分别使用Date.Calendar.Joda Time. 本例从新加坡时区 (GMT+8:00) Asia/Singapore - Singapore ...

  5. java时区转换 夏令时_实现时区的转换--涉及到冬令时和夏令时的时候

    #时区转换 主要是用来转换时区用的,特别涉及到冬令时和夏令时的区域,这样会很烦,所以需要用个方法来转换 这个主要是创建一些模型 using System; using System.Collectio ...

  6. Linux shell不同时区时间转换(时区 夏令时 时间戳)

    如果目标地区没有使用夏令时,可以日期或时间戳直接减去小时差,也可以使用下面兼容夏令时的方法. 概念:         时间戳 :从格林威治时间1970年01月01日00时00分00秒起至现在的总秒数. ...

  7. js时区时间转换格式:h5内转换含有T字母的8小时时区时间格式

    1.后台传过来的数据含有时区日期,该日期为浏览器识别日期,此时进行日期格式的转换,如采用getFullYears()等方法后,手机微信打开的h5界面则显示为NAN,非法日期格式,此时应采用如下方法转换 ...

  8. java不同时区时间转换,Java不同时区(timezone)之间时间转换

    最近出现一个问题是这样的 我们的系统在国外打印的日志时间由于时差关系和国内不一致 看起来不方便 希望国外的日志和国内保持一致 即 需要对不同时区的时间做转换调整 统一为国内时间. 一.关于时区的一些概 ...

  9. java 不同时区时间转换_Java对世界不同时区timezone之间时间转换的处理方法

    最近出现一个问题是这样的:我们的系统在国外打印的日志时间由于时差关系和国内不一致,看起来不方便,希望国外的日志和国内保持一致,即:需要对不同时区的时间做转换调整,统一为国内时间. 一.关于时区的一些概 ...

最新文章

  1. 百篇大计敬本年之C++坎坷之路 —— Warning:will be initialized after [-Wreorder]
  2. python先序、中序、后序排序
  3. JavaScript称霸
  4. 北京五环以内将全面禁止新建和扩建数据中心
  5. Unity 利用Coroutine实现跳动数字效果
  6. Oracle不打算修复这两个iPlanet信息泄漏和注入漏洞
  7. springmvc以html作为视图_SpringMVC如何自定义视图
  8. Qt 之 QToolBox
  9. 暴力猴简单脚本 - 去除右键菜单、文本选择限制
  10. 考计算机初级难不难,初级程序员好考吗_考试难不难_上学吧
  11. 计算机管理格式化硬盘,磁盘管理格式化硬盘出错的解决方法
  12. vue中组件的父子关系
  13. 智齿客服签约垂直日本的最大旅游服务平台仙贝旅行
  14. SNF快速开发平台--多组织+多平台+多系统处理方案
  15. java中的odb_obd适配器的初始化
  16. XGBoost: A Scalable Tree Boosting System翻译
  17. python在屏幕上画画_想学画画?python满足你!
  18. facebook修改权限_如何在Facebook上更改小组的隐私
  19. 浅谈C语言中数组理解
  20. 让任正非陷入“迷茫”的,不只是华为……

热门文章

  1. VisualFreeBasic+Miniblink做浏览器实现js内容替换
  2. 项目规划时间轴流程图
  3. b、B、KB、Kib、MB、MiB、GB、GiB、TB、TiB的区别
  4. smartform解决越南文预览正常 打印后字符乱码
  5. 城市地摊重燃人间烟火,农村赶集却快熄灭烟火
  6. 用 Python 进行办公自动化都需要学习什么知识
  7. Win11 预览体验计划空白无显示的一种解决方案
  8. 2022 *CTF REVERSE的Simple File System
  9. 段码LCD段码屏的驱动原理
  10. 桌面时钟(JS版本)-electron