如何在跨越午夜后计算时间差?Python

4
所以这个想法非常简单(是的,它只是一个练习,不是真实的问题)。
有一个女孩的时钟是错误的,但她朋友的时钟总是正确的。当她离开家时,她记得她的时钟离开的时间,在她的朋友那里,她看到了她到达和离开的时间,一旦回到家,她再次看到了时间。这样,即使我们不知道她开多长时间车,我们也可以知道正确的时间。 例如,她在6:32离开,在她的地方,她在14:14与朋友一起到达并在17:21与朋友再次出发,并于13:29回到家。
她总共花费了6:57的时间,其中3:07与她的朋友在一起,其余的时间平均分配给2个车程的时间。
因此,如果将这段时间与您离开朋友家的时间相加,则找到实际时间。
现在我之前已经解决了这个问题,但那时我不知道datetime函数,所以我想也许我可以用这种方法解决它。我的烦恼是datetime过了午夜就会卡住
例如,当她在家中出发时是9:04,在6:15到达并在14:54离开以返回5:13时,我得到正确的时间是8:57,而实际上应该是20:57。
也许是我的datetime.timedelta中的某些东西,但我不知道如何解决。任何建议都非常欢迎 非常感谢
我目前的代码:
import datetime

# function nessesary to convert timedelta back into time 
def convert_timedelta(duration):
    days, seconds = duration.days, duration.seconds
    hours = days * 24 + seconds // 3600
    minutes = (seconds % 3600) // 60
    seconds = (seconds % 60)
    return hours, minutes, seconds

# input
hour_department_home = int(input("Hour of department at home: "))
minutes_department_home = int(input("Minutes of department at home: "))

hour_arrival_friend = int(input("Hour of arrivel friends house: "))
minutes_arrival_friend = int(input("Minutes of department friends house: "))

hour_department_friend = int(input("Hour of arrivel friends house: "))
minutes_department_friend = int(input("Minutes of arrivel friends house: "))

hour_arrival_home = int(input("Hour of arrivel home : "))
minutes_arrival_home = int(input("Minutes of arrivel home: "))

# putting into hours
department_home = datetime.time(hour_department_home,minutes_department_home,second=0)
arrival_friend = datetime.time(hour_arrival_friend,minutes_arrival_friend)
department_friend = datetime.time(hour_department_friend,minutes_department_friend)
arrival_home= datetime.time(hour_arrival_home,minutes_arrival_home)

# time at friends
uur_1,uur_2 = datetime.timedelta(hours=department_friend.hour),datetime.timedelta(hours = arrival_friend.hour)
hours_with_friend = uur_1-uur_2

min_1,min_2= datetime.timedelta(minutes=department_friend.minute),datetime.timedelta(minutes=arrival_friend.minute)
min_with_friend = min_1-min_2

total_time_with_friend = hours_with_friend + min_with_friend

# time away
uur_1h,uur_2h = datetime.timedelta(hours=arrival_home.hour),datetime.timedelta(hours = department_home.hour)
hours_away_from_home = uur_1h-uur_2h

min_1h,min_2h= datetime.timedelta(minutes=arrival_home.minute),datetime.timedelta(minutes=department_home.minute)
min_away_from_home = min_1h-min_2h

total_time_away = hours_away_from_home + min_away_from_home

duration_drive = (total_time_away-total_time_with_friend) /2

the_time = datetime.timedelta(hours=department_friend.hour,minutes=department_friend.minute) +duration_drive

hours, minutes, seconds = convert_timedelta(the_time)

print(hours)
print(minutes)

你总是关注着“时间”,却忘记了日期。 - Frank AK
@Baduker 的评论:如果我错了,请纠正我,但这可能会有所帮助(和/或是重复的):Python format timedelta greater than 24 hours - Mr. T
@Baduker 谢谢您的评论,我之前看过这个,但它没有真正帮助我。 - Jirka
1个回答

1

使用datetime.datetime而不是datetime.time,它将考虑到日期的变化。

date_1 = datetime.datetime(year1, month1, day1, hour1, minutes1, seconds1)
date_2 = datetime.datetime(year2, month2, day2, hour2, minutes2, seconds2)
timedelta = date_2 - date_1

然后你有 timedelta.seconds, timedelta.days, timedelta.microsecondstimedelta.total_seconds(),如果需要浮点数。


那我应该使用datetime.datetime而不是datetime.time吗? - Jirka
1
@LibertyVerleysen 是的,你应该使用datetime.datetime而不是datetime.time。因为datetime.time没有意识到日期变化(即你提到的午夜过后)。 - Reck
所以我尝试了这个,但我不太知道要输入什么日期等内容,这有关系吗?显然没有标准日期,从我的问题开始,我就不知道日期是什么,因为她的时钟(错误的)仍然可能是前一天。 - Jirka
使用start_date = datetime.datetime(1, 1, 1, START_HOUR, START_MINUTE, START_SECOND)来设置出发时间的数据。对于到达时间,如果小时数小于START_HOUR,则使用datetime.datetime(1, 1, 2, END_HOUR, END_MINUTE, END_SECOND),否则使用datetime.datetime(1, 1, 1, ....)。虽然有些丑陋,但如果你只有HH:MM:SS这一个数据,使用datetime也无法更好地处理,使用一些% 24% 60以及一些逻辑操作可能会更加幸运。 - Gabriel Samain
@GabrielSamain,如问题所述,我之前在没有使用日期时间的情况下就已经解决了它。当时并不知道日期时间,只是认为这样做会更容易,但显然并不是这样。非常感谢您的帮助,现在我对日期时间的理解更加深入了。 - Jirka

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