Python Unix时间戳转换与时区
大家好!我遇到了一些关于时区的问题。
我有一个时间戳:2010年7月26日 23:35:03。
我真正想做的是从这个时间减去15分钟。
我打算的方法很简单,就是先把它转换成Unix时间戳,然后减去相应的秒数,再转换回来。听起来很简单,对吧?
但我的问题是,Python会根据我所在的本地时区来调整返回的Unix时间戳,而我现在的时区是东部夏令时,应该是GMT -4。
所以当我这样做的时候:
# packet[20] holds the time stamp
unix_time_value = (mktime(packet[20].timetuple()))
我得到的结果是1280201703,也就是2010年7月27日 03:35:03。我可以这样做:
unix_time_value = (mktime(packet[20].timetuple())) - (4 * 3600)
但现在我还得考虑东部标准时间,也就是GMT -5,所以我需要把(4 * 3600)改成(5 * 3600)。有没有办法告诉Python不要使用我的本地时区,直接转换这个时间戳,或者有没有简单的方法可以从packet[20]中减去15分钟呢?
3 个回答
往下滑动,看看关于从日期中减去时间的内容:http://pleac.sourceforge.net/pleac_python/datesandtimes.html
在线文档里有一个很实用的表格(你所说的“unix时间”更准确的说法是“UTC”,也就是“协调世界时间”,而“自纪元以来的秒数”则称为“时间戳”,它是一个浮点数...):
可以使用以下函数在不同的时间表示之间进行转换:
From To Use
seconds since the epoch struct_time in UTC gmtime()
seconds since the epoch struct_time in local time localtime()
struct_time in UTC seconds since the epoch calendar.timegm()
struct_time in local time seconds since the epoch mktime()
这里提到的函数名来自于time
模块(因为文档就是在这里的;-)。所以,既然你一开始有一个struct_time in UTC
,可以用calendar.timegm()
来获取时间戳(也就是“自纪元以来的秒数”),然后减去15 * 60 = 900
(因为单位是秒),最后用time.gmtime
把得到的“自纪元以来的秒数”转换回struct_time in UTC
。如果你更喜欢使用当地时间,可以用time.mktime
和time.localtime
(但如果这15分钟跨越了夏令时的切换点,可能会有问题——始终使用UTC会更可靠)。
当然,要使用calendar.timegm
,你的代码里需要有import calendar
(通常把导入放在脚本或模块的顶部是比较好的做法)。
减去 datetime.timedelta(seconds=15*60)
。