带有不同工作日的两个时间戳之间的差异?

问题描述

我有以下日期:

Tue 19:00-20:00
Wed 04:25-15:14

如何获得Tue 20:00Wed 04:25间的区别?

我尝试在datetime对象中对其进行转换,但是由于我没有月份或年份中的哪一天,因此两个对象的日期都相同:

d1 = datetime.strptime("Tue 20:00","%a %H:%M")
d2 = datetime.strptime("Wed 04:25","%a %H:%M")
  • d1是:datetime.datetime(1900,1,20,0)
  • d2为:datetime.datetime(1900,4,25)

分钟数的差应为505,但在这种情况下将为-935.0,因为它们具有相同的日期,因此它们相差近16小时而不是大约8个半小时:>

diff = (d2 - d1).total_seconds() / 60  # -935.0

解决方法

datetime.strptime()不能执行其他任何操作,因为星期几不足以形成日期。您需要一周的工作日和一年的工作日才能有意义。如果您需要获取假定在同一周内的两个日期之间的相对差异,那么任何周数和年份都可以,例如:

arbitrary_iso_week = "2020-25 "

d1 = datetime.strptime(arbitrary_iso_week + "Tue 20:00","%G-%V %a %H:%M")
d2 = datetime.strptime(arbitrary_iso_week + "Wed 04:25","%G-%V %a %H:%M")

这利用了%G and %V formatters for ISO 8601 week numbers

这将产生具有更有意义的日期关系的日期时间对象:

>>> arbitrary_iso_week = "2020-25 "
>>> d1 = datetime.strptime(arbitrary_iso_week + "Tue 20:00","%G-%V %a %H:%M")
>>> d2 = datetime.strptime(arbitrary_iso_week + "Wed 04:25","%G-%V %a %H:%M")
>>> d1
datetime.datetime(2020,6,16,20,0)
>>> d2
datetime.datetime(2020,17,4,25)
>>> (d2 - d1).total_seconds() / 60
505.0

实际日期在这里并不重要,只是它们之间的天数差异。 d1现在早于d2,但不晚于此。

您可能需要考虑周日是循环的,因为您可能有一个较早的日期(例如星期五)和一个较晚的日期(星期一)。如果可以假设第一个值必须早于第二个值,那么解决方案就很简单。如果晚于d1,请从d2中减去7天:

# if the first date must come before the second,then it must be one week earlier.
if d1 > d2:
    d1 -= timedelta(days=7)