Как вычислить точную разницу между датами в годах на Java Script?

198
11 ноября 2018, 15:40

Как определить точную разницу в годах между текущей датой и датой в формате "0000-00-00 00:00:00". На PHP это решается просто:

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

Есть подобное элегантное решение на Java Script?

Answer 1

Создать два объекта Date – день рождения и сейчас. Чтобы гарантированно правильно получить из текстовой строки, как у вас, объект даты, надо привести её сначала к формату ISO 8601. Проще всего заменить пробел на букву "T". Но такая дата будет в часовом поясе UTC, надо её скорректировать, добавив минуты из getTimezoneOffset(). Например, дата "2014-09-12 00:00:00" по Мск, это 11 сентября 21:00 по UTC. При сравнении из «сейчас» будем тоже брать время по UTC – getUTCMonth() и т.п.

Получив две даты, сравним их месяцы и дни. Если требуется бОльшая точность, то ещё и часы, минуты, секунды:

var sqlDT = "2014-09-12 00:00:00";
var BD = new Date( sqlDT.replace(' ','T'));
var Now = new Date();
BD.setMinutes( BD.getMinutes() + Now.getTimezoneOffset()); // в UTC
if( BD.getMonth() === Now.getUTCMonth()
  && BD.getDate() === Now.getUTCDate()
) {
  // ура! День рождения!
  var y = Now.getUTCFullYear() - BD.getFullYear(); // сколько полных лет
}

Альтернативный вариант – подключить библиотеку для работы с датами и временем – MomentJS, и найти подходящие методы в ней.

Answer 2

Если вы под точной разницей имели в виду именно значение года, а не годы по количеству прошедших месяцев, то можно так:

var unix_date = "2016-01-01 00:00:00";  
var jsYear = new Date(unix_date).getFullYear();  
var currentYear = new Date().getFullYear(); 
var yearsDifference = currentYear - jsYear; 
console.log(yearsDifference);

Answer 3

Итоговый код. На вход идет дата в формате '0000-00-00 00:00:00', на выходе количество полных лет с текущей даты:

function age_count(date) {
    // now
    var now = new Date();
    now.setMinutes(now.getMinutes() - now.getTimezoneOffset());
    now = now.toISOString().substr(0, 19).replace('T',' ');
    // calculate
    var age = now.substr(0, 4) - date.substr(0, 4);
    if(now.substr(5) < date.substr(5)) --age;
    // output
    return age;
}
READ ALSO
Как получить результатом одно из двух?

Как получить результатом одно из двух?

Мне нужно сделать, чтобы после нажатия кнопки "проверка" с вероятностью в 50% отображался текст "Да" или "Нет" Как это реализовать?

188