为什么介于Datetime和Timedelta之间的持续时间要短1h?

时间:2019-06-30 11:45:22

标签: python python-3.x datetime time timedelta

我正在尝试自动记录我的工作时间,并且需要一种方法来获取开始时间和结束时间之间的持续时间。在研究过程中,我遇到了 this 这个问题似乎可以解决我的问题。

但是,当尝试获取“ 11:30”和“ 12:30”之间的持续时间时,datetime.time()方法返回“ 00:00:00”,我不知道为什么。

这是我正在使用的代码。

from datetime import datetime, timedelta
from time import strptime

start = strptime("11:30", "%H:%M")
stop = strptime("12:30", "%H:%M")

start_dt = datetime(100, 1, 1, start.tm_hour, start.tm_min)

duration = start_dt + timedelta(hours=stop.tm_hour,
                                minutes=stop.tm_min,
                                seconds=0)

print(duration.time())

这是我的预期(期望)输出: 01:00:00

这是我得到的实际输出: 00:00:00

我想知道它是否与我用来获取小时和分钟值的time.strptime()方法有关,所以我也尝试这样做:

from datetime import datetime, timedelta

start_dt = datetime(100, 1, 1, 11, 30)

duration = start_dt + timedelta(hours=12,
                                minutes=30,
                                seconds=0)

print(duration.time())

输出保持不变。有人知道为什么吗?我完全不知所措。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

简短答案:您将这两次相加了,而在一定时间内,您需要计算差异

因为您将两者加在一起。确实,您的select (case when month(current date) <= 1 then to_date(year(current date) || '01-01', 'YYYY-MM-DD') else to_date(year(current date) + 1 || '01-01', 'YYYY-MM-DD') end) as jan_start_of_month, (case when month(current date) <= 2 then to_date(year(current date) || '02-01', 'YYYY-MM-DD') else to_date(year(current date) + 1 || '02-01', 'YYYY-MM-DD') end) as feb_start_of_month, . . . 看起来像:start_dt,并且您在其中添加了1-1-100 11:30,所以这意味着:

12:30

或午夜,第二天。

如果要计算时差,可以将两者相减,例如:

start_dt   1-1-100  11:30
+                   12:30
-------------------------
           2-1-100  00:00

这给了我们

start = datetime.strptime('11:30', '%H:%M')
stop = datetime.strptime('12:30', '%H:%M')
duration = stop - start  # minus (-), not plus (+)

大约3600秒或一小时。

话虽如此,时间是非常模糊的,因为它是特定于时区的:取决于您所在的位置以及时间(由于某些国家/地区更改了时区),所以结果可能会完全不同。 / p>