Python Unix时间戳转换与时区

3 投票
3 回答
4713 浏览
提问于 2025-04-16 03:17

大家好!我遇到了一些关于时区的问题。

我有一个时间戳: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 个回答

1

往下滑动,看看关于从日期中减去时间的内容:http://pleac.sourceforge.net/pleac_python/datesandtimes.html

6

在线文档里有一个很实用的表格(你所说的“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.mktimetime.localtime(但如果这15分钟跨越了夏令时的切换点,可能会有问题——始终使用UTC会更可靠)。

当然,要使用calendar.timegm,你的代码里需要有import calendar(通常把导入放在脚本或模块的顶部是比较好的做法)。

6

减去 datetime.timedelta(seconds=15*60)

撰写回答