The code below should return last Friday, 16:00:00. But it returns Friday of previous week. How to fix that?
now = datetime.datetime.now()
test = (now - date
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)
Could be lame but to me simplest. Get the last day of the current month and start checking in a loop (which wouldn't cost anything since max loops before finding last friday is 7) for friday. if last day is not friday decrement and the check the day before.
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()
As in the linked question, you need to use datetime.date
objects instead of datetime.datetime
. To get a datetime.datetime
in the end, you can use 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
Simplest solution without dependency:
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))
The dateutil library is great for things like this:
>>> 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)
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)