查找多次之间的时间差

2024-09-26 18:09:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在创建一个应用程序,它可以查看日出和日落,以查看白天/夜间的持续时间(以小时为单位)。目前,我有两个python datetime对象,它们表示持续时间的开始和结束时间,并且我已经在datetime对象中有日落和日出的时间。我知道我的代码非常混乱,但当我知道我在处理这个问题时,我会修复它

到目前为止,我的代码是:

if(datetime_object_1 <= datetime_object_2 <= sunrise <= sunset):
    return (0,differencehours(datetime_object_1, datetime_object_2))
elif(datetime_object_1 <= sunrise <= datetime_object_2 <= sunset):
    return (differencehours(datetime_object_2, sunrise), differencehours(datetime_object_1, sunrise))
elif(sunrise <= datetime_object_1 <= datetime_object_2 <= sunset):
    return (differencehours(datetime_object_1, datetime_object_2),0)
elif(sunrise <= datetime_object_1 <= sunset <= datetime_object_2):
    return (differencehours(datetime_object_1, sunset), differencehours(datetime_object_2, sunset))
elif(sunrise <= sunset <= datetime_object_1 <= datetime_object_2):
    return (0,differencehours(datetime_object_1, datetime_object_2))
else:
    return (None, None)

def difference(datetime_str_1, datetime_str_2):
    if(datetime_object_1 > datetime_object_2):
        datetime_object_1_replace = datetime_object_1
        datetime_object_2_replace = datetime_object_2
        datetime_object_2 = datetime_object_1_replace
        datetime_object_1 = datetime_object_2_replace
    difference = datetime_object_2 - datetime_object_1
    return difference

def differencehours(datetime_str_1, datetime_str_2):
    return (difference(datetime_str_1, datetime_str_2).total_seconds / 3600.0)

Tags: 对象代码datetimereturnobject时间replace持续时间
2条回答

在python中查找datetime对象之间的时间差非常非常简单。就像delta = datetime1 - datetime2一样简单。要在几秒钟内获得它,请使用delta.total_seconds()演示:

import time, datetime
a = datetime.datetime.now()
time.sleep(1.5)
b = datetime.datetime.now()
delta = b - a
print(delta.total_seconds())

正如Zen of Python所说,Simple is better than complex.

如果您使用一个简单的逻辑来计算夜间/白天的工作时间,然后从总工作时间中减去它,分别得到白天/夜间,那么您可以大大简化代码

你不需要那么多if else

下面的代码可以实现此目的:

from datetime import datetime

sunrise_time = datetime(2020, 3, 22, 5, 0, 0, 0)  # 5 am
sunset_time = datetime(2020, 3, 22, 18, 0, 0, 0)  # 6 pm

duration_start = datetime(2020, 3, 22, 15, 0, 0, 0)
duration_end = datetime(2020, 3, 22, 17, 0, 0, 0)


def difference_in_seconds(time1, time2):
    return (time1 - time2).total_seconds()


def find_day_night_hours_duration(d_start, d_end, sunrise, sunset) -> (float, float):
    working_seconds = (d_end - d_start).total_seconds()

    night_working_seconds = 0

    if d_start < sunrise:
        # they started before sunrise, add it to night hours
        night_working_seconds = difference_in_seconds(sunrise, d_start)

    if sunset < d_end:
        # means, they worked after sunset
        night_working_seconds += difference_in_seconds(d_end, sunset)
    if night_working_seconds > working_seconds:
        # all working hours are night hours
        return 0, working_seconds / 3600

    return (working_seconds - night_working_seconds) / 3600, (night_working_seconds) / 3600


print(find_day_night_hours_duration(duration_start, duration_end, sunrise_time, sunset_time))

输出:

(2.0, 0.0)

相关问题 更多 >

    热门问题