将周中某一天的时间与周中某一天的时间进行比较



是否有一种直接的方法来测试now是否在同一周的周五下午5点到周日下午5点之间?

此尝试返回False,因为它没有比较now.time()相对于now.isoweekday() >= 5now.isoweekday() <= 7True

[in]:
import datetime
now = datetime.datetime.now()
print(now)
(now.isoweekday() >= 5 and now.time() >= datetime.time(17, 0, 0, 0)) and (now.isoweekday() <= 7 and now.time() <= datetime.time(17, 0, 0, 0))
[out]:
2022-12-17 10:00:32.253489
False

基本上你要找的条件是:周五下午5点之后,周六任何时间,或周日下午5点之前。这很容易表达:

(now.isoweekday() == 5 and now.time() >= datetime.time(17, 0, 0, 0)
or now.isoweekday() == 6
or now.isoweekday() == 7 and now.time() <= datetime.time(17, 0, 0, 0)
)

另一个选项是:

  • 找出now属于
  • 的日历周
  • 生成该日历周的周末界限
  • 测试now是否在这些边界之间

但我认为如果你只测试这一个条件,那实际上比上面的更复杂;如果它是重复模式的一部分,这样的方法会更有意义。

import datetime
def is_weekend_time(my_datetime):
if (my_datetime.isoweekday() == 5):
return datetime.time(17, 0, 0, 0) <= my_datetime.time()
if (my_datetime.isoweekday() == 6):
return True
if (my_datetime.isoweekday() == 7):
return my_datetime.time() < datetime.time(17, 0, 0, 0)
return False
now = datetime.datetime.now()
print(now)
print(is_weekend_time(now))
print()
friday_before = datetime.datetime(2022,12,16,16,59,59)
print('Friday Before')
print(friday_before)
print(is_weekend_time(friday_before))
print()
friday_after = datetime.datetime(2022,12,16,17,00,00)
print('Friday After')
print(friday_after)
print(is_weekend_time(friday_after))
print()
saturday = datetime.datetime(2022,12,17,16,59,59)
print('Saturday')
print(saturday)
print(is_weekend_time(saturday))
print()
sunday_before = datetime.datetime(2022,12,18,16,59,59)
print('Sunday Before')
print(sunday_before)
print(is_weekend_time(sunday_before))
print()
sunday_after = datetime.datetime(2022,12,18,18,00,00)
print('Sunday After')
print(sunday_after)
print(is_weekend_time(sunday_after))

2022-12-17 16:01:40.826755
True
Friday Before
2022-12-16 16:59:59
False
Friday After
2022-12-16 17:00:00
True
Saturday
2022-12-17 16:59:59
True
Sunday Before
2022-12-18 16:59:59
True
Sunday After
2022-12-18 18:00:00
False

下面是另一种比较日期时间

的方法
now = datetime.datetime.now()
weekday = now.isoweekday()
print(now, weekday)
upper_bound = (now + datetime.timedelta(days=7 - weekday)).replace(
hour=17, minute=0, second=0, microsecond=0
)
lower_bound = (now - datetime.timedelta(days=weekday - 5)).replace(
hour=17, minute=0, second=0, microsecond=0
)
print(upper_bound, upper_bound.isoweekday())
print(lower_bound, lower_bound.isoweekday())
lower_bound <= now < upper_bound
2022-12-18 00:37:56 7
2022-12-18 17:00:00 7
2022-12-16 17:00:00 5
True

如果在计算边界之前应用replace函数实际上会更好,但这将更容易理解(和更可定制)

编辑:

嗯,当我看到一些关于可读性的评论时,我已经更新了稍微更长但更易读的版本

now = datetime.datetime.now()
print(now, now.isoweekday())
def weeekday_to_datetime(now, target_weekday, target_hour):
target_date = now + datetime.timedelta(days=(target_weekday - now.isoweekday()))
return target_date.replace(hour=target_hour, minute=0, second=0, microsecond=0)

lower_bound = weeekday_to_datetime(now, target_weekday=5, target_hour=17)
print(lower_bound, lower_bound.isoweekday())
upper_bound = weeekday_to_datetime(now, target_weekday=7, target_hour=17)
print(upper_bound, upper_bound.isoweekday())
lower_bound <= now < upper_bound
2022-12-18 02:08:47 7
2022-12-16 17:00:00 5
2022-12-18 17:00:00 7
True

最新更新