1. Главная страница
  2. ››
  3. Формулы
  4. ››
  5. Расчёт количества времени после прошедшей даты до даты расчёта - Upline Studio

Расчёт количества времени после прошедшей даты до даты расчёта - Upline Studio

Задача

Пусть первый рабочий день был 1 января в прошлом году, а текущий день — 15 февраля этого года. Формула рассчитает, что прошло "1 год 1 месяц 14 дней" и покажет это. Формула не делит дни на рабочие и выходные. Она просто считает прошедшие дни.

Основные переменные

Данная формула собирает большой перечень переменных для расчета. За основу берется дата в UNIX формате в переменной table.current.firstWorkDay.

total — вычитает исходную дату из сегодняшней даты

y, m, — считают количество лет и месяцев

d — отрабатывает условие, что если кол-во дней меньше одного, рассчитает дату без учета кол-ва лет, а если больше одного, то с учетом кол-ва лет

cury, curm, curd — округление в меньшую сторону переменных, указанных выше.

Формула

 

if(table.current.firstWorkDay == null, "Не указан первый рабочий день", 

let({
  first: table.current.firstWorkDay,
  firstdate: toDate(first),
  today: toNumber(now()),
  total:  today - first,
  y: total / 31556926000,
  m: (total / 2629743000) - (floor(y) * 12),
  d: if((total / 86400000 / 365.24) < 1, total / 86400000, (total / 86400000 / 365.24)),
  cury: floor(y),
  curm: floor(m),
  curd: floor(d),
  ywords: ['год', 'года', 'лет'],
  mwords: ['месяц', 'месяца', 'месяцев'],
  dwords: ['день', 'дня', 'дней'],
  years: cury & ' ' & ywords[if(
  cury % 100 > 4 and cury % 100 < 20,
  2, [2, 0, 1, 1, 1, 2][if(cury % 10 > 5, 5, cury % 10)]
)],
  month: curm & ' ' & mwords[if(
  curm % 100 > 4 and curm % 100 < 20,
  2, [2, 0, 1, 1, 1, 2][if(curm % 10 > 5, 5, curm % 10)]
)],
  days: curd & ' ' & dwords[if(
  curd % 100 > 4 and curd % 100 < 20,
  2, [2, 0, 1, 1, 1, 2][if(curd % 10 > 5, 5, curd % 10)]
)],
},
if(cury <= 0, "", years)  
& " " & 
if(curm <= 0, "", month)
& " " &
if(curd <= 0, "меньше одного дня", days)
)

)

Объяснение автора

Где "table.current.firstWorkDay" — это ваша дата в UNIX формате из БД

  1. Сначала формула проверяет, есть ли у нас первый рабочий день. Если нет, то выводим сообщение «Не указан первый рабочий день».
  1. Если первый рабочий день есть, мы превращаем его и текущий день в числа и считаем разницу между ними в миллисекундах. Затем превращаем эту разницу в годы, месяцы и дни.
  1. Когда у нас уже есть годы, месяцы и дни, она их округляет до целых чисел. Затем выбирает правильные слова для описания лет (год/года), месяцев (месяц/месяца) и дней (день/дня).

Скриншоты из Creatium

Полный анализ кода

Этот код на Creatium выполняет следующие действия:

  1. Если в поле firstWorkDay таблицы table.current не указана дата, скрипт вернет строку "Не указан первый рабочий день".
  1. Если дата указана, код начинает вычислять количество лет, месяцев и дней, прошедших с этой даты до текущего момента. Для этого он преобразует firstWorkDay в формат даты, получает текущую дату и время в числовом формате и вычитает из нее дату firstWorkDay. Полученное число total представляет собой разницу в миллисекундах между текущим моментом и firstWorkDay.
  1. Далее код переводит эту разницу в года (y), месяцы (m) и дни (d). Вычисления основаны на среднем количестве миллисекунд в году, месяце и дне.
  1. Затем скрипт округляет полученные значения до ближайшего целого числа, чтобы получить текущее количество полных лет (cury), месяцев (curm) и дней (curd).
  1. В следующем блоке кода создаются списки слов, которые будут использоваться для формирования строк с количеством лет, месяцев и дней. Эти списки учитывают различия в склонении числительных в русском языке.
  1. После этого формируются строки с количеством лет, месяцев и дней, которые учитывают правила склонения числительных в русском языке.
  1. Наконец, в зависимости от того, сколько лет, месяцев и дней прошло с первого рабочего дня, формируется итоговая строка. Если прошло 0 лет, то годы не указываются. Если прошло 0 месяцев, то месяцы не указываются. Если прошло меньше дня, то выводится "меньше одного дня". В противном случае выводится количество дней.

Таким образом, этот скрипт используется для определения количества времени, прошедшего с даты firstWorkDay до текущего момента, и вывода этого времени в удобочитаемом формате.

Формат ответа

Если данный скрипт насчитает 754 дня (на самом деле он ведёт рассчёт в миллисекундах), то его конечный ответ будет выглядеть следующим образом: 2 года 1 месяц 4 дня.

Источники

Дмитрий Соловей — @solovey_nchub

Другие формулы Creatium

Logo Upline Studio Creatium

Наша команда Uplinestudio разрабатывает сайты под разные потребности клиентов. Одним из ключевых направлений в нашей разработке является создание сайтов на Creatium.

Оставить заявку

Работает на Creatium