aprenoir
@aprenoir
программный архитектор

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

Как определить точную разницу в годах между текущей датой и датой в формате "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?
  • Вопрос задан
  • 2601 просмотр
Решения вопроса 1
aprenoir
@aprenoir Автор вопроса
программный архитектор
Итоговый код. На вход идет дата в формате '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;
}


P.S. Если кто знает, как более кратко привести текущую дату к формату '0000-00-00 00:00:00' - просьба написать в комментариях.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Adamos
@Adamos
var date1 = '2014-09-12 12:34:56';
var date2 = '2017-09-12 12:34:56';
if(date1.substr(5) == date2.substr(5) {
  alert('Господин программный архитектор, у вас день рождения наступило!');
} else {
  var years = date2.substr(0, 4) - date1.substr(0, 4);
  if(date2.substr(5) < date1.substr(5)) {
    --years;
  }
  alert('Вам таки ' + years + ' полных лет, а толку?');
}
Ответ написан
sergiks
@sergiks Куратор тега JavaScript
♬♬
Создаём два объекта 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()
) {
  // ура! День рождения!
}


P.s. альтернативный вариант – подключить здоровенную библиотеку для работы с датами и временем – MomentJS, и найти подходящие методы в ней.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы