请选择 进入手机版 | 继续访问电脑版

雨滴科技技术论坛

 找回密码
 立即注册
查看: 1305|回复: 0

python datetime中关于时区的一处陷阱

[复制链接]

282

主题

1583

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
17029
扫一扫,手机访问本帖
发表于 2017-10-14 17:03:45 | 显示全部楼层 |阅读模式
在python中可以使用datetime构建一个时间对象,如果同时传入时区参数,结果会把时间搞错。
以我遇到的情况,时间被提前了6分钟。

使用datetime类构建一个时间对象,同时传入了时区参数。
  1. >>> dt1 = datetime.datetime(2017, 10, 14, 16, 0, 0, 0, pytz.timezone('Asia/Shanghai'))
  2. >>> ddt1
  3. datetime.datetime(2017, 10, 14, 16, 0, tzinfo=)
复制代码


将这个时间对象转化成UTC时区的时间.
  1. >>> ddt2 = ddt1.astimezone(pytz.utc)
  2. >>> ddt2
  3. datetime.datetime(2017, 10, 14, 7, 54, tzinfo=)
复制代码

这时候可以发现,时间已经发生变化。

再转换回本地时间。
  1. >>> ddt2.astimezone(pytz.timezone('Asia/Shanghai'))
  2. datetime.datetime(2017, 10, 14, 15, 54, tzinfo=)
复制代码


单看时间,从16:00变成了15:54。

从时区信息中可以发现一些端倪,一个是 LMT+8:06:00 一个是 CST+8:00:00。

LMT(Local Mean Time)是一种地方观测太阳平均计时的时间,地方不同所以会有差异,一般使用较少。
CST(China Standard Time)表示中国标准时间,代表的是UTC+8:00。

出现上面的问题的原因是,不应该通过直接传入时区参数来构造datetime对象。

pytz库文档中有写,构造一个本地时间的方法是使用pytz库中提供的localize()方法。像下面这样处理就没有问题。
  1. >>> pytz.timezone('Asia/Shanghai').localize(datetime.datetime(2017, 10, 14, 16, 0, 0, 0))
  2. datetime.datetime(2017, 10, 14, 16, 0, tzinfo=)
复制代码

datetime构造方法不应传入timezone参数。
文档中明确提出,如果传入pytz时区参数到datetime的构造方法,大部分情况是行不通的(does not work)。
不过,如果传入的是utc时间,就没问题。

所以在处理时间的时候,最好的做法是都转换成UTC时间,只在需要输出的时候再转换成本地时间。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

在线客服
在线咨询
咨询热线
0755-26787502-8006/8016
扫一扫二维码
直接访问本站

QQ|Archiver|手机版|小黑屋|雨滴科技  

GMT+8, 2020-8-15 21:02 , Processed in 0.059282 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表