如何在Python中计算时间差

2 投票
3 回答
9294 浏览
提问于 2025-04-16 02:20

我想做的是从一个日期中减去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 个回答

1

注意:我减去七个小时是因为我想把时间从协调世界时(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的标准库里。

1

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) 这样的方式,或者用其他你觉得清楚的方式来表达你想做的事情。

2

这个timedelta的代码行是干嘛的?它是怎么工作的?

它创建了一个timedelta对象。

这里的“时间”有两个意思。

  • 一个是“时间点”(比如日期或具体的时间)

  • 另一个是“持续时间”或者说时间间隔,也就是“时间差”

时间差就是一个时间段、一个持续的时间。你提供了三个值。

  • 0天。

  • 2*60*60 + 30*60秒。

撰写回答