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)

Upd2。例を挙げると。今日が2012年10月5日であると仮定しましょう。現在の時刻が16:00以下の場合は、2012年9月28日を返す必要があります。それ以外の場合は、2012年10月5日を返します。

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.dateリンクされた質問のように、の代わりにオブジェクトを使用する必要があります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

これはJonClementsから借りたものですが、完全な解決策です。

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

原則は他の質問と同じです。

今週の金曜日を取得し、それ以降の場合は1週間を減算します。

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 に答える