Как получить период платежного цикла между 26-м от предыдущего месяца и 25-го числа текущего месяца с использованием PytPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как получить период платежного цикла между 26-м от предыдущего месяца и 25-го числа текущего месяца с использованием Pyt

Сообщение Anonymous »

Проблема < /h2>
Я строю биллинговую систему в 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 () предпочтительнее).
edit -Решение
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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»