如何在Python中计算时间差
我想做的是从一个日期中减去7个小时。我在Stack Overflow上查找了相关的内容,找到了如何做到这一点的答案,具体可以在这里查看。我接着去阅读了关于timedelta的文档,因为我不太明白那个被接受答案中的代码行在做什么,这里为了方便我把它重新写了一遍:
from datetime import datetime
dt = datetime.strptime( date, '%Y-%m-%d %H:%M' )
dt_plus_25 = dt + datetime.timedelta( 0, 2*60*60 + 30*60 )
不幸的是,即使看了文档,我还是不明白那行代码是怎么工作的。
timedelta这一行到底在做什么?它是怎么运作的?
另外,在我找到这个Stack Overflow帖子之前,我一直在使用time.struct_time元组。我有一个变量tm:
tm = time.strptime(...)
我只是通过tm.tm_hour来获取小时数,然后从中减去七,但显然这样做是行不通的。这就是为什么我现在想使用datetime。tm现在的值是
tm = datetime.strptime(...)
我在想,使用datetime是不是减去七个小时的最佳方法?
注意:我之所以要减去七个小时,是因为我想把时间从UTC转换到美国/太平洋时区。有没有什么内置的方法可以做到这一点?
3 个回答
注意:我减去七个小时是因为我想把时间从协调世界时(UTC)转换到美国太平洋时间。有没有简单的方法可以做到这一点?
当然有:datetime
模块自带了时区转换的功能。如果你用下面的方式获取你的datetime
对象:
tm = datetime.strptime(date_string, '%Y-%m-%d %H:%M')
一开始它不会有任何特定的时区“附加”在上面,但你可以通过下面的方式给它添加一个时区:
tm_utc = tm.replace(tzinfo=pytz.UTC)
然后你可以用下面的方式把它转换成美国太平洋时间:
tm_pacific = tm_utc.astimezone(pytz.all_timezones('US/Pacific'))
我建议你使用这种方法,而不是手动减去七个小时,因为这样可以清楚地表明你只是把时间转换到另一个时区,而不是在试图得到七小时前的时间。此外,时区转换还可以正确处理一些特殊情况,比如夏令时。
要做到这一点,你需要安装一个叫做pytz
的包,这个包不在Python的标准库里。
timedelta() 是一个用来表示时间段的工具——在数学中,希腊字母 delta 通常用来表示“差异”。所以,当你想计算时间的加法或减法时,你需要从一个起始时间开始,然后加上你想要的时间变化,也就是 delta。
你提到的这个具体调用是用来生成 2.5 小时的时间段。第一个参数是天数,第二个是秒数,所以你可以理解为 (0 天, 2.5 小时)。而 2.5 小时换算成秒就是 (2 小时 * 60 分钟/小时 * 60 秒/分钟) + (30 分钟 * 60 秒/分钟)。
在你的情况下,你有一个负的时间段,表示 0 天,7 小时,所以你可以这样写:
timedelta(0, -7 * 60 * 60)
... 或者用 timedelta(0, -7 * 3600) 这样的方式,或者用其他你觉得清楚的方式来表达你想做的事情。
这个timedelta的代码行是干嘛的?它是怎么工作的?
它创建了一个timedelta对象。
这里的“时间”有两个意思。
一个是“时间点”(比如日期或具体的时间)
另一个是“持续时间”或者说时间间隔,也就是“时间差”
时间差就是一个时间段、一个持续的时间。你提供了三个值。
0天。
2*60*60 + 30*60秒。