Python 上周五怎么去?

Python 上周五怎么去?,python,datetime,Python,Datetime,下面的代码应在上周五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) Upd。我现在使用以下方法-这是最好的方法吗 now = datetime

下面的代码应在上周五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)
Upd。我现在使用以下方法-这是最好的方法吗

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)
Upd2。举个例子。假设今天是2012年10月5日。如果当前时间等于或小于16:00,则应返回2012年9月28日,否则返回2012年10月5日。

对于以下内容非常有用:

>>> 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)

与链接问题一样,您需要使用
datetime.date
对象,而不是
datetime.datetime
。要最终获得
datetime.datetime
,可以使用
datetime.datetime.combine()


原理与中的相同

得到当前一周的星期五,如果我们晚一点,减去一周

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)

这是从Jon Clements那里借来的,但这是完整的解决方案:

>>> 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)

可能是跛脚的,但对我来说最简单。获取当月的最后一天,并开始检查周五的循环(这不会花费任何费用,因为在查找上周五之前的max loops为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()

无依赖性的最简单解决方案:

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))
从datetime导入datetime,timedelta
def get_上周五():
now=datetime.now()
最近的星期五=现在+时间差(天=(4-now.weekday())
返回(如果最近的星期五<现在,则为最近的星期五
星期五-时间差(天=7))

神圣蟹块。把你的代码分开@“如果今天是星期五,你希望它怎么工作?”博尼说,这取决于时间。如果16:00已经过去了,那么应该是今天。否则-上一周的星期五。这个解决方案是好的。您只需要在一天中的某个时间添加.replace调用。@lauu太遗憾了-我不知道GAE是一个约束,我想我可以单独安装它。但我更愿意在没有第三方库的情况下这样做。无论如何,谢谢你的帮助。如果今天是星期五,我怎么能用这个代码得到上星期五?@Americancurl你可以做min(mon-1day-relativedelta(weekday=MO(-1)),mon-relativedelta(weekday=MO(-1))看起来如果今天是2012年10月6日,您的代码将返回9月28日,预计10月5日。谢谢。我必须清楚地解释下一次需要什么…您在2012年10月5日的代码将始终返回2012年9月28日。但如果当前时间等于或小于16:00,则应返回2012年9月28日,否则返回2012年10月5日。在这个答案中,我假设from Fr.16:00:01 on,您需要本周的日期时间。
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))