#python #datetime #calendar
#python #дата и время #Календарь
Вопрос:
Я провел некоторое исследование по этому вопросу и не нашел ничего, что было бы близко к тому, что я хочу. начиная с того, что я довольно новичок в python, поэтому большая часть моего python не очень «pythonic».. помимо этого, я хочу получить дату начала и дату окончания каждой недели, предшествующей текущей дате. в основном я хотел получить рекомендации о том, как это сделать, поскольку существует несколько разных способов сделать это. должен ли я рассмотреть возможность создания его из week number
? или просто с помощью datetime
?
Я надеялся создать его в этом формате
[{
'start': 2013-12-30,
'end': 2014-01-05
},{
'start': 2014-01-06,
'end': 2014-01-12
}... etc]
Моя первоначальная попытка:
from datetime import date, timedelta
def get_week_days(self, year, week, **kwd):
d = date(year,1,1)
if(d.weekday()>3):
d = d timedelta(7-d.weekday())
else:
d = d - timedelta(d.weekday())
dlt = timedelta(days = (week-2)*7)
last_wk = {}
last_wk['start'] = d dlt
last_wk['end'] = d dlt timedelta(days=6)
return last_wk
возвращает дату начала и окончания заданной недели по номеру недели. Я мог бы выполнить цикл и вызвать эту функцию, указав количество недель, прошедших в году, но я не уверен, эффективно ли это, или этот метод можно / нужно очистить?
любые рекомендации о том, как я должен это сделать, были бы полезны 🙂 спасибо
Комментарии:
1. Все ваши недели начинаются с января. 1? Также мне любопытно, я знаю, что в Европе принято форматировать даты как дд / мм / гггг, но кто использует гггг-дд-мм? Стандарт ISO — гггг-мм-дд, и это сбивает с толку, если смотреть на это наоборот.
2. неделя, начинающаяся первого января, была просто для примера. формат — это еще одна вещь, которая была примером. это в гггг-мм-дд, я просто написал это задом наперед. я использую гггг-мм-дд, поскольку именно так он изложен в базе данных, с которой мне приходится работать 🙂 я пошел дальше и отредактировал его для вас, чтобы он был в правильном формате и в правильные даты
Ответ №1:
Итак, вызов вашего метода в цикле, безусловно, будет работать. Недостатком этого является то, что вам приходится воссоздавать все заново при каждом вызове метода. Поскольку недели идут последовательно, возможно, было бы лучше найти первую неделю, а затем добавить 1 день, чтобы найти начало следующей недели. Таким образом, вы отталкиваетесь от своей предыдущей работы, и вам не нужно воссоздавать все свои объекты.
Один из способов сделать это — использовать getNextWeek
метод.
def getNextWeek(week):
nextWeek = {};
nextWeek['start'] = week['end'] timedelta(days=1)
nextWeek['end'] = nextWeek['start'] timedelta(days=6)
return nextWeek
Комментарии:
1. Хорошо, это кажется выполнимым 🙂 итак, в методе, который я написал, похоже, есть проблема, потому что, если номер моей недели равен 0, 1 или 2, он возвращается за несколько недель до 30 декабря 2013 года.. знаете ли вы, где моя ошибка?
2. @JohnRuddell Я мало что сделал с
date
ortimedelta
, но готов поспорить, что в документации есть объяснение такого поведения.