鱼C论坛

 找回密码
 立即注册
查看: 109|回复: 7

[已解决]如何计算时差

[复制链接]
发表于 2024-12-6 11:55:26 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
1、在24小时制下   计算   时间段   23.00---2.00   1.00---3.00  这两个时间段加一起是  4个小时
2、在24小时制下,计算   时间段   9.00---10.00    15.00---17.00  9.30--12.00  这三个时间段 加一起  是   5个小时  
请问   如何计算?
最佳答案
2024-12-6 16:29:34
本帖最后由 jackz007 于 2024-12-7 20:12 编辑
def delta(p , * t) :
    e = []
    for a , b in t :
        if a < p : a += 24
        if b < p : b += 24
        for k in range(len(e)) :
            if e[k][0] <= a <= e[k][1] or e[k][0] <= b <= e[k][1] :
                if e[k][0] <= a <= e[k][1] :
                    if b > e[k][1] : e[k][1] = b
                else :
                    if a < e[k][0] : e[k][0] = a
                break
        else :
            e . append([a , b])
    return sum(map(lambda x : int(x[1] - x[0]) , e))
                
print(delta(23 , (23.00 , 2.00) , (1.00 , 3.00)))
print(delta(9 , (9.00 , 10.00) , (15.00 , 17.00) , (9.30 , 12.00)))
        运行实况:
D:\[exercise]\Python>python x.py
4
5

D:\[exercise]\Python>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-12-6 11:55:33 | 显示全部楼层
计算时差可以通过将每个时间段的开始时间和结束时间相减来得到每个时间段的时长,然后将所有时间段的时长相加即可。

1. 对于时间段 23.00---2.00 和 1.00---3.00:
   - 23.00 到 2.00:跨越午夜,计算为 (24 - 23) + 2 = 3 小时
   - 1.00 到 3.00:计算为 3 - 1 = 2 小时
   - 总时长为 3 + 2 = 5 小时

2. 对于时间段 9.00---10.00、15.00---17.00 和 9.30--12.00:
   - 9.00 到 10.00:计算为 10 - 9 = 1 小时
   - 15.00 到 17.00:计算为 17 - 15 = 2 小时
   - 9.30 到 12.00:计算为 12 - 9.5 = 2.5 小时
   - 总时长为 1 + 2 + 2.5 = 5.5 小时

注意:如果时间段有重叠,需要去除重叠部分的时长。


以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-12-6 11:57:47 | 显示全部楼层
FishC 发表于 2024-12-6 11:55
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

错,这两个 重叠段  你都没有去除  所以结果全部错误
另,如何使用代码实现,,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-12-6 12:04:37 | 显示全部楼层
wp231957 发表于 2024-12-06 11:57
错,这两个 重叠段  你都没有去除  所以结果全部错误
...


要计算多个时间段的总时长并去除重叠部分,可以使用编程语言来实现。以下是一个使用Python的示例代码:
def calculate_total_hours(time_ranges):
    # 将时间段转换为分钟
    minutes_ranges = [(start * 60, end * 60) for start, end in time_ranges]
    
    # 合并重叠的时间段
    merged_ranges = []
    for start, end in sorted(minutes_ranges):
        if merged_ranges and merged_ranges[-1][1] >= start:
            merged_ranges[-1] = (merged_ranges[-1][0], max(merged_ranges[-1][1], end))
        else:
            merged_ranges.append((start, end))
    
    # 计算总时长
    total_minutes = sum(end - start for start, end in merged_ranges)
    total_hours = total_minutes / 60
    return total_hours

# 示例时间段
time_ranges_1 = [(23, 2), (1, 3)]
time_ranges_2 = [(9, 10), (15, 17), (9.5, 12)]

# 计算总时长
total_hours_1 = calculate_total_hours(time_ranges_1)
total_hours_2 = calculate_total_hours(time_ranges_2)

print(f"第一个时间段的总时长: {total_hours_1} 小时")
print(f"第二个时间段的总时长: {total_hours_2} 小时")

在这个代码中,我们首先将时间段转换为分钟,然后合并重叠的时间段,最后计算总时长。注意,时间段如 `(23, 2)` 表示从晚上11点到凌晨2点。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-12-6 16:29:34 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2024-12-7 20:12 编辑
def delta(p , * t) :
    e = []
    for a , b in t :
        if a < p : a += 24
        if b < p : b += 24
        for k in range(len(e)) :
            if e[k][0] <= a <= e[k][1] or e[k][0] <= b <= e[k][1] :
                if e[k][0] <= a <= e[k][1] :
                    if b > e[k][1] : e[k][1] = b
                else :
                    if a < e[k][0] : e[k][0] = a
                break
        else :
            e . append([a , b])
    return sum(map(lambda x : int(x[1] - x[0]) , e))
                
print(delta(23 , (23.00 , 2.00) , (1.00 , 3.00)))
print(delta(9 , (9.00 , 10.00) , (15.00 , 17.00) , (9.30 , 12.00)))
        运行实况:
D:\[exercise]\Python>python x.py
4
5

D:\[exercise]\Python>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-12-6 16:54:25 | 显示全部楼层
from datetime import datetime, timedelta

def calculate_union_hours(time_ranges):
    # 将时间段按开始时间排序
    sorted_ranges = sorted(time_ranges, key=lambda x: x[0])
    
    # 合并重叠或相邻的时间段
    merged_ranges = []
    for start, end in sorted_ranges:
        if not merged_ranges or start > merged_ranges[-1][1]:
            merged_ranges.append((start, end))
        else:
            merged_ranges[-1] = (merged_ranges[-1][0], max(merged_ranges[-1][1], end))
    
    # 计算总时长
    total_hours = 0
    for start, end in merged_ranges:
        total_hours += (end - start).total_seconds() / 3600  # 秒转小时
    
    return total_hours

# 示例时间段(使用 datetime 对象)
time_ranges1 = [
    (datetime(2024, 12, 6, 23, 0), datetime(2024, 12, 7, 2, 0)),
    (datetime(2024, 12, 7, 1, 0), datetime(2024, 12, 7, 3, 0)),
]

time_ranges2 = [
    (datetime(2024, 12, 6, 9, 0), datetime(2024, 12, 6, 10, 0)),
    (datetime(2024, 12, 6, 15, 0), datetime(2024, 12, 6, 17, 0)),
    (datetime(2024, 12, 6, 9, 30), datetime(2024, 12, 6, 12, 0)),
]

# 计算并集总小时数
total_hours1 = calculate_union_hours(time_ranges1)
print(f"1、总小时数: {total_hours1}")

total_hours2 = calculate_union_hours(time_ranges2)
print(f"2、总小时数: {total_hours2}")
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-12-6 17:34:36 | 显示全部楼层
如果有需求计算重复的时间段,我认为,至少23:00 - 1:00 这种时间段不合理。因为跨越天数,你问题表达的重叠段隐形条件应该是在同一天内。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-12-9 08:27:28 | 显示全部楼层
Stubborn 发表于 2024-12-6 17:34
如果有需求计算重复的时间段,我认为,至少23:00 - 1:00 这种时间段不合理。因为跨越天数,你问题表达的重 ...

好久不见了哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 12:00

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表