15

下面的代码应该在上周五 16:00:00 返回。但它返回前一周的星期五。如何解决?

now = datetime.datetime.now()
test = (now - datetime.timedelta(days=now.weekday()) + timedelta(days=4, weeks=-1))
test = test.replace(hour=16,minute=0,second=0,microsecond=0)

更新。我现在使用以下方法 - 它是最好的吗?

now = datetime.datetime.now()
if datetime.datetime.now().weekday() > 4:
    test = (now - datetime.timedelta(days=now.weekday()) + timedelta(days=4))
else:
    test = (now - datetime.timedelta(days=now.weekday()) + timedelta(days=4, weeks=-1))
test = test.replace(hour=16,minute=0,second=0,microsecond=0)

更新2。只是举个例子。假设今天是Oct 5, 2012。如果当前时间等于或小于16:00,则应返回Sep 28, 2012,否则 - Oct 5, 2012

4

6 回答 6

36

dateutil非常适合这样的事情:

>>> from datetime import datetime
>>> from dateutil.relativedelta import relativedelta, FR
>>> datetime.now() + relativedelta(weekday=FR(-1))
datetime.datetime(2012, 9, 28, 9, 42, 48, 156867)
于 2012-10-02T08:43:35.177 回答
17

与链接的问题一样,您需要使用datetime.dateobjects 而不是datetime.datetime. 最后,您可以datetime.datetime使用datetime.datetime.combine()

import datetime

current_time = datetime.datetime.now()

# get friday, one week ago, at 16 o'clock
last_friday = (current_time.date()
    - datetime.timedelta(days=current_time.weekday())
    + datetime.timedelta(days=4, weeks=-1))
last_friday_at_16 = datetime.datetime.combine(last_friday, datetime.time(16))

# if today is also friday, and after 16 o'clock, change to the current date
one_week = datetime.timedelta(weeks=1)
if current_time - last_friday_at_16 >= one_week:
    last_friday_at_16 += one_week
于 2012-10-02T08:43:51.523 回答
4

This was borrowed from Jon Clements, but is the full solution:

>>> from datetime import datetime
>>> from dateutil.relativedelta import relativedelta, FR
>>> lastFriday = datetime.now() + relativedelta(weekday=FR(-1))
>>> lastFriday.replace(hour=16,minute=0,second=0,microsecond=0)
datetime.datetime(2012, 9, 28, 16, 0, 0, 0)
于 2012-10-02T08:50:35.537 回答
2

没有依赖的最简单的解决方案:

from datetime import datetime, timedelta

def get_last_friday():
    now = datetime.now()
    closest_friday = now + timedelta(days=(4 - now.weekday()))
    return (closest_friday if closest_friday < now
            else closest_friday - timedelta(days=7))
于 2016-08-27T12:17:15.633 回答
1

The principle is the same as in your other question.

Get the friday of the current week and, if we are later, subtract one week.

import datetime
from datetime import timedelta
now = datetime.datetime.now()
today = now.replace(hour=16,minute=0,second=0,microsecond=0)
sow = (today - datetime.timedelta(days=now.weekday()))
this_friday = sow + timedelta(days=4)
if now > this_friday:
     test = this_friday
else:
     test = this_friday + timedelta(weeks=-1)
于 2012-10-02T08:50:07.953 回答
0

可能很蹩脚,但对我来说最简单。获取当前月份的最后一天并开始检查周五的循环(因为在找到上周五之前的最大循环数为 7,因此不会花费任何费用)。如果最后一天不是星期五递减和前一天的检查。

import calendar
from datetime import datetime, date

def main():
    year = datetime.today().year    
    month = datetime.today().month  
    x = calendar.monthrange(year,month)
    lastday = x[1]
    while True:
        z = calendar.weekday(year, month, lastday)
        if z != 4:
            lastday -= 1
        else:
            print(date(year,month,lastday))
            break

if __name__ == "__main__":
    main()
于 2014-09-04T01:21:28.210 回答