【问题标题】:How do I find the difference between two datetimes excluding a time gap in the day?如何找到两个日期时间之间的差异,不包括一天中的时间间隔?
【发布时间】:2020-06-25 15:40:28
【问题描述】:

我想在当前datetime 之前的n 小时前获得datetime,不包括从 16:30 到 8:00 的时间间隔。 p>

因此,如果当前的datetimedatetime(2020, 06, 25, 14, 0),并且我想获得具有-5 小时增量的datetime,我只需像往常一样获得datetime(2020, 06, 25, 9, 0)datetime。但是,如果当前时间是 10:00,我希望返回的 datetimedatetime(2020, 06, 24, 13, 30)。所以它排除了时间间隔,并返回datetime,就好像时间间隔根本不存在一样。

我自己尝试过解决这个问题,但这是很糟糕的代码,而且并没有真正起作用。我需要帮助找到更好的解决方案。

now = datetime.now()
datetime_new = now - timedelta(hours=N_HOURS)
print(datetime_new)

if datetime_new.hour < 8:
    prev_day = datetime(datetime_new.year,
                        datetime_new.month,
                        datetime_new.day - 1,
                        16, 30)
    this_day = datetime(datetime_new.year,
                        datetime_new.month,
                        datetime_new.day,
                        8, 0)

    diff2prev = datetime_new - prev_day
    diff2next = this_day - datetime_new
    total_diff = diff2prev + diff2next
    datetime_new -= total_diff

elif datetime_new.hour > 16 and datetime_new.minute > 30:
    this_day = datetime(datetime_new.year,
                        datetime_new.month,
                        datetime_new.day,
                        16, 30)
    next_day = datetime(datetime_new.year,
                        datetime_new.month,
                        datetime_new.day + 1,
                        8, 0)

    diff2prev = datetime_new - this_day
    diff2next = next_day - datetime_new
    total_diff = diff2prev + diff2next
    datetime_new -= total_diff

【问题讨论】:

    标签: python datetime timedelta


    【解决方案1】:

    你为什么不试试:

    datetime_new = now - timedelta(hours=N_HOURS)
    if datetime_new.hour < 8 or (datetime_new.hour > 16 and datetime_new.minute > 30):
        datetime_new = datetime_new - timedelta(hours=15,minutes=30)
    

    【讨论】:

    • 这在某些情况下不起作用,例如如果您在 11:00 使用 delta -12,它将首先跳回 23:00,在应用 delta -16:30 后,它将返回 6:30,即排除时间之间。无论如何感谢您的回答!
    • 然后把if改成while。另一种方法是创建一个 df,其日期时间索引仅包含 8 到 16:30 之间的小时数。然后你只需要本地化你的日期时间并增加增量行。
    【解决方案2】:

    我想我明白了。我不得不改变它,如果当前时间晚于 16:30,它首先回到 16:30,然后开始应用增量。它也仅在不早于 08:00 时才有效,但这可以通过条件来修复。这是我的解决方案:

    now = datetime.now()
    if now > datetime(now.year, now.month, now.day, 16, 30):
        now = datetime(now.year, now.month, now.day, 16, 30)
    
    hours_left = N_HOURS
    while hours_left > 0:
        now -= timedelta(hours=1)
        hours_left -= 1
    
        if now.hour < 8:
            diff_mins = 60 - now.minute
            now = datetime(now.year, now.month, now.day - 1, 16, 30)
            now -= timedelta(minutes=diff_mins)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多