Как получить epoch time на момент месяц, год назад?

Получаем текущую отметку epoch time (количество прошедших секунд) сейчас

import time    
epoch_time = int(time.time())

Как получить производные от текущей отметки:

  • месяц назад
  • три месяца назад
  • год назад
  • два года назад?

Просто отнимать количество секунд в месяце, году - видится плохим вариантом, т.к. в месяцах разное количество дней...


Ответы (1 шт):

Автор решения: diduk001

Для начала, вам надо преобразовать timestamp в дату с помощью функции fromtimestamp библиотеки datetime, а затем вычесть из даты нужное кол-во дней / месяцев / лет с помощью dateutil.relativedelta.relativedelta

import datetime
import dateutil.relativedelta
import time

epoch_time = int(time.time())

current_date = datetime.datetime.fromtimestamp(epoch_time)

month_ago = current_date - dateutil.relativedelta.relativedelta(months=1)
three_month_ago = current_date - dateutil.relativedelta.relativedelta(months=3)
year_ago = current_date = current_date - \
    dateutil.relativedelta.relativedelta(years=1)
two_years_ago = current_date = current_date - \
    dateutil.relativedelta.relativedelta(years=2)


print(current_date)
print(month_ago)
print(three_month_ago)
print(year_ago)
print(two_years_ago)

# 2020-04-19 09:41:28
# 2023-03-19 09:41:28
# 2023-01-19 09:41:28
# 2022-04-19 09:41:28
# 2020-04-19 09:41:28

P.S.: Поскольку вы не указали определение "месяц назад", я посчитал, что это значит "день в предыдущем месяце не больший дня в текущем". Так, например, если бы вы вызвали этот код 31.03.2023, то дата месяц назад была бы 28.02.2023. Если вам хочется вычесть количество дней, вы можете использовать days=31, а не months=1. Если вы хотите получить количество день в текущем месяце, вы можете использовать модуль calendar:

import calendar

days_in_month = calendar.monthrange(current_year, current_month)[1]

UPD: Чтобы получить именно timestamp, вы можете использовать метод .timestamp(). Пример:

current_date = datetime.datetime.fromtimestamp(epoch_time)
print(int(current_date.timestamp()))
→ Ссылка