在Python中计算两个时间之间的差异

8

我正在使用Python,并希望计算两个时间之间的差异。

实际上,我有一个场景需要计算登录和注销时间之间的差异,例如在组织中,工作时间有一定的限制,所以如果用户在早上 9:00 AM 登录并在晚上 6:00 PM 注销,我们需要计算他在办公室停留的时间(在当前情况下为9小时),但我想在Python中完成这个操作,那么能否请有经验的开发者告诉我如何计算登录和注销时间之间的差异?


你正在计算两个deltas之间的差异,而不是两个时间点之间的差异?!? - Has QUIT--Anony-Mousse
1
delta = 变化量,你正在比较时间上的变化。 - Gjordis
抱歉,但我的概念是计算登录和注销时间的持续时间。 - Fedrik
然后尝试修复您上面的代码,不要使用“timedelta”来表示“时间”。 - Has QUIT--Anony-Mousse
抱歉我的问题打字有点错误,但我的意图是计算登录和注销时间的持续时间,有人能在Python中实现吗? - Fedrik
4个回答

20
>>> start = datetime.datetime(year=2012, month=2, day=25, hour=9)
>>> end = datetime.datetime(year=2012, month=2, day=25, hour=18)
>>> diff = end - start
>>> diff
datetime.timedelta(0, 32400)
>>> diff.total_seconds()
32400
>>> diff.total_seconds() / 60 / 60
9
>>> 

1
你可以打印 str(dif) 代替 diff.seconds/60/60 来获得更好的格式。 - Ionut Hulub
1
如果您已登录超过一天,您将需要使用 diff.total_seconds() - John La Rooy
我们如何在这里提供小时值,例如用户在上午9点登录并在下午6点注销? - Fedrik

5

使用divmod完成此任务。

>>> start = datetime.datetime.utcnow()
>>> end = datetime.datetime.utcnow()
>>> divmod(end - start, 60)
(0, 2.454) # (minutes, seconds)

divmod()非常有用,可将时间秒转换为所需的分钟或小时。 - Iam Zesh
4
divmod函数不支持datetime或timedelta对象,你需要使用end.seconds和start.seconds。 - Marcel Wilson

2
您一开始就使用了错误的类来表示时间。
> import datetime
> print datetime.datetime.now() - datetime.datetime(2013, 1, 1)
55 days, 14:11:06.749378

返回的对象是一个timedelta。但是,差异当然是在datetime对象之间计算出来的。


2

在我看来,@Fabian的回答可能是最好的。但我们是否把它弄得过于困难了?

你需要按天、月、年来计算吗?

如果您正在生成此内容,直接使用时间戳表示会更容易。

当用户登录时:

user_login_time = time.time()

当用户再次访问时:
time_difference = time.time() - user_login_time

然后检查time_difference是否超过XXXX秒?现在我假设您只想检查用户是否已经XX分钟或xx小时未登录? 否则,我会强调@Fabian的答案是最好的,如果您正在解析时间日期字符串,或需要对数据进行其他时间/日期函数。 我还要强调,如果您使用此方法,请为时间制作常量,或确保对其进行注释,以使其更易读。 但是,如果您只是想查找用户在过去30分钟内是否已经登陆,则这可能更容易。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接