+1 к числу каждый год

Babyaka

Постоялец
Регистрация
19 Окт 2012
Сообщения
53
Реакции
5
Добрый день. Подскажите пожалуйста, как реализовать такой скрипт? На сайте есть числа (стаж работы сотрудников), и нужно чтобы каждый год к данным числам прибавлялся +1 и также менялось написание. Пример: сегодня "1 год", через год в тот же день уже "2 года", или сегодня "4 года", а через год уже "5 лет".
 

Q_BASIC

Хранитель порядка
Регистрация
30 Ноя 2013
Сообщения
514
Реакции
1.186
Откуда js знает кому какой стаж ставить?

В php например, записывать в поле год начала работы, потом выводить <?=(date('Y') - $start_year)?>

Если год начала работы 2009, а сейчас 2020 - выедет число 11

Склонение можешь отсюда взять Для просмотра ссылки Войди или Зарегистрируйся
На js:
declension_word(1, ['яблоко', 'яблока', 'яблок']);
declension_word(3, ['яблоко', 'яблока', 'яблок']);
...
 

garphild

Постоялец
Регистрация
19 Май 2009
Сообщения
60
Реакции
31
Вариант не самый лучший, но он читабелен и последователен.
Код:
<?php

function getFullYearsBetweenDates($start, $current)
{
  /** Здесь это можно сделать через разбивку даты по дефису. Приведенный здесь вариант более универсален. */
  $userStartDate = strtotime($start);
  $currentDate = strtotime($current);
  /** Берем год по дате начала и текущей, а также месяц и день. */
  $userStartDateM = intval(date("m", $userStartDate));
  $currentDateM = intval(date("m", $currentDate));
  $userStartDateD = intval(date("d", $userStartDate));
  $currentDateD = intval(date("d", $currentDate));
  $userStartDateYear = intval(date("Y", $userStartDate));
  $currentDateYear = intval(date("Y", $currentDate));

  /** Получаем количество лет между датами. */
  $worksYears = $currentDateYear - $userStartDateYear;
  /** Теперь проверяем разницу между месяцами. Если текущий месяц меньше стартового, то нужно убрать неполный год */
  if ($currentDateM < $userStartDateM) $worksYears -= 1;
  /** То же самое делаем с датой для переходного месяца */
  if ($currentDateM == $userStartDateM && $currentDateD < $userStartDateD) $worksYears -= 1;
  /** При дате М-Д больше, чем стартовая ничего не делаем */
  return $worksYears;
}

/** Тесты */
$testDatePairs = [
  ['2012-10-11', '2015-11-10'], //3 полых года
  ['2012-10-11', '2015-10-12'], //3 полых года
  ['2012-10-11', '2015-10-11'], //3 полых года
  ['2012-10-11', '2015-10-10'], //2 полых года
  ['2012-10-11', '2015-05-10'], //2 полых года
  ['2012-10-11', '2013-05-10'], //0 полых года
  ['2012-10-11', '2013-10-10'], //0 полых года
  ['2012-10-11', '2013-10-11'], //1 полых года
  ['2012-10-11', '2013-11-11'], //1 полых года
];

foreach($testDatePairs as $dates) {
  echo "{$dates[0]} - {$dates[1]} : ".getFullYearsBetweenDates($dates[0], $dates[1])."\n";
}
 

Q_BASIC

Хранитель порядка
Регистрация
30 Ноя 2013
Сообщения
514
Реакции
1.186
Вариант не самый лучший, но он читабелен и последователен.
Код:
<?php

function getFullYearsBetweenDates($start, $current)
{
  /** Здесь это можно сделать через разбивку даты по дефису. Приведенный здесь вариант более универсален. */
  $userStartDate = strtotime($start);
  $currentDate = strtotime($current);
  /** Берем год по дате начала и текущей, а также месяц и день. */
  $userStartDateM = intval(date("m", $userStartDate));
  $currentDateM = intval(date("m", $currentDate));
  $userStartDateD = intval(date("d", $userStartDate));
  $currentDateD = intval(date("d", $currentDate));
  $userStartDateYear = intval(date("Y", $userStartDate));
  $currentDateYear = intval(date("Y", $currentDate));

  /** Получаем количество лет между датами. */
  $worksYears = $currentDateYear - $userStartDateYear;
  /** Теперь проверяем разницу между месяцами. Если текущий месяц меньше стартового, то нужно убрать неполный год */
  if ($currentDateM < $userStartDateM) $worksYears -= 1;
  /** То же самое делаем с датой для переходного месяца */
  if ($currentDateM == $userStartDateM && $currentDateD < $userStartDateD) $worksYears -= 1;
  /** При дате М-Д больше, чем стартовая ничего не делаем */
  return $worksYears;
}

/** Тесты */
$testDatePairs = [
  ['2012-10-11', '2015-11-10'], //3 полых года
  ['2012-10-11', '2015-10-12'], //3 полых года
  ['2012-10-11', '2015-10-11'], //3 полых года
  ['2012-10-11', '2015-10-10'], //2 полых года
  ['2012-10-11', '2015-05-10'], //2 полых года
  ['2012-10-11', '2013-05-10'], //0 полых года
  ['2012-10-11', '2013-10-10'], //0 полых года
  ['2012-10-11', '2013-10-11'], //1 полых года
  ['2012-10-11', '2013-11-11'], //1 полых года
];

foreach($testDatePairs as $dates) {
  echo "{$dates[0]} - {$dates[1]} : ".getFullYearsBetweenDates($dates[0], $dates[1])."\n";
}
Что ты делаешь? Для чего такие изощрения? Если хочешь дату в таком формате хранить, есть функция strtotime, которая заменяет весь твой код на одну строчку
 

garphild

Постоялец
Регистрация
19 Май 2009
Сообщения
60
Реакции
31
Что ты делаешь? Для чего такие изощрения? Если хочешь дату в таком формате хранить, есть функция strtotime, которая заменяет весь твой код на одну строчку

Код больше учебный, чем на продакшн. А функция strtotime в данном случае имеет несколько минусов. Постановку задачи внимательно прочитай. Через год в тот же день. Если использовать чисто strtotime то возникает проблема с високосными годами, например. И строчек будет уже несколько больше. Так как еще и секунды нужно будет учитывать в дне. Неявные такие проблемки. :) А если потом окажется что день приема на работу считать не нужно...
Но, действительно, день туда, день сюда - какая разница. Можно ведь вообще считать что в году 52 недели и не париться, как это в банках делают часто с расчетом срока депозита. :)

Из практики - дата чаще всего приходит именно в таком формате. Особенно если в базе стоит тип DATE.

Можно ведь было и так: $date = explode("-", $startDate). Но видишь ли ты здесь подвох?
Можно было и так: ceil((time() - $startTime)/SECONDS_IN_YEAR). Очень читабельно. Неужели и здесь подвоха нет? Хочешь чтоб тебя поздравляли с днем рождения или любой другой знаменательной датой на день раньше? Или на день позже?

А и еще.
DateTime::createFromFormat("Y-m-d H:i:s", '2014-09-12 00:00:00')
->diff(new DateTime('now'))
->y;

А вообще я прошу прощения, но неправильно прочитал тему. Нужно же было склонения и на яваскрипте. Виноват. :(
 
Последнее редактирование:

Babyaka

Постоялец
Регистрация
19 Окт 2012
Сообщения
53
Реакции
5
Большое спасибо за варианты и подсказки, буду пробовать. Да, желательно код на JS, потому что сайт на конструкторе, где с php скриптами проблема возникает. И да, прошу прощения что ввел в заблуждение, не обязательно чтобы стаж менялся в тот же день, главное чтобы год прошел.
 

garphild

Постоялец
Регистрация
19 Май 2009
Сообщения
60
Реакции
31
Тогда плюс-минус получается так с учетом високосных годов. Иначе каждые 4 года будет отставать на 1 день. Вроде так. Предыдущий вариант неправильный.
Код:
var startDate = new Date('2015-01-22');
var currentDate = new Date();
var yearsWithoutLeaf = Math.ceil((currentDate - startDate) /31536000000);
var yearsWithLeaf = Math.ceil(( currentDate - startDate + Math.ceil(yearsWithoutLeaf%4)) /31536000000);
 
Последнее редактирование:

gxenakis

Создатель
Регистрация
20 Июл 2014
Сообщения
13
Реакции
8
You could also try with moment.js for checking and Date functions in Javascript.
It can save you a lot of time.
eg.
Код:
var years = moment().diff('2015-01-01', 'years');
var days = moment().diff('2015-01-01', 'days');
For additional reference, you can read moment.js Для просмотра ссылки Войди или Зарегистрируйся.
 

FullNull

Создатель
Регистрация
7 Фев 2013
Сообщения
34
Реакции
11
По-моему, разумнее в БД хранить не количество отработанных лет, а год трудоустройства. Тогда в любой момент (в т.ч. при выводе на экран) можно будет это количество посчитать. Не хранят же возраст человека, хранят год рождения.
 

garphild

Постоялец
Регистрация
19 Май 2009
Сообщения
60
Реакции
31
По-моему, разумнее в БД хранить не количество отработанных лет, а год трудоустройства. Тогда в любой момент (в т.ч. при выводе на экран) можно будет это количество посчитать. Не хранят же возраст человека, хранят год рождения.

Человек устроился 29 декабря 2005 года. Если хранить только год, то 1 января 2006 он уже вроде как год отработал. А по человеку хранят не год рождения, а дату. Более того, обычно спрашивают количество "полных лет", которое без даты будет посчитать корректно нельзя имея только год.
 
Сверху