Я строю биллинговую систему в Django, и мне нужно рассчитать период выставления счетов для каждого счета. (00:00:00);
[*] и заканчивается на 25-м текущего месяца в 23:59:59.start = datetime(2025, 6, 26, 0, 0, 0)
end = datetime(2025, 7, 25, 23, 59, 59)
Мы используем django, поэтому даты должны быть timezone-aware (UTC предпочтительный 2025-06-26T03: 00: 00Z вместо 2025-06-26t00: 00: 00Z .
Что мы попробовали
Мы попробовали следующую функцию:
from datetime import datetime, timedelta
from dateutil.relativedelta import relativedelta
def get_invoice_period(reference_date: datetime = None) -> tuple[datetime, datetime]:
if reference_date is None:
reference_date = datetime.now()
end = (reference_date - timedelta(days=1)).replace(hour=23, minute=59, second=59, microsecond=0)
start = (reference_date - relativedelta(months=1)).replace(day=26, hour=0, minute=0, second=0, microsecond=0)
return start, end
Но это вызывает проблемы с часовым поясом, а DateTime.now () не является временным сейфом в Django. Поэтому, когда мы сохраняем эти значения в базу данных, Django преобразует их в UTC, смещая время (например, +3 часа). < /P>
Мы смотрели: < /p>
- Этот ответ от Mitghi < /li>
и этот вопрос, который был закрыт < /li>
и этот вопрос, который был закрыт < /li> < /br />
и этот вопрос, который был закрыт < /li> < /li>
и этот вопрос, который был закрыт < /br />
и этот вопрос, который был закрыт. Они решают бизнес-логику и хорошо работает с django timezone-ware times. Из предыдущего месяца , в полночь; - Второй-25-й из текущего месяца , в 23:59:59;
- pytz.UTC или django's Timezone.now () предпочтительнее).
from django.utils import timezone
from dateutil.relativedelta import relativedelta
def get_invoice_period(reference_date=None):
if reference_date is None:
reference_date = timezone.localtime()
start = reference_date - relativedelta(months=1)
start = start.replace(day=26, hour=0, minute=0, second=0, microsecond=0)
end = reference_date.replace(day=25, hour=23, minute=59, second=59, microsecond=0)
return start, end
Подробнее здесь: https://stackoverflow.com/questions/797 ... th-and-the