簡體   English   中英

將星期幾的時間與星期幾的時間進行比較

[英]Comparing time of day on day of week to time of day on day of week

有沒有一種直接的方法來測試now是否在同一周的周五下午 5 點和周日下午 5 點之間?

此嘗試返回False ,因為它不比較now.time()相對於now.isoweekday() >= 5now.isoweekday() <= 7首先是True

[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

如果在計算邊界之前應用替換函數實際上會更好,但這會更容易理解(並且更可定制)

編輯:

好吧,當我看到一些關於可讀性的評論時,我已經更新了稍長但更具可讀性的版本

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM