Как получить количество дней до моего следующего дня рождения?

Я пробовал это, но он терпел неудачу

var diffDays1=(function(){ 
var oneDay = 24*60*60*1000; // hours*minutes*seconds*milliseconds
var secondDate = new Date(new Date().getFullYear()+1,4,5);
var firstDate = new Date();
 return Math.round(Math.abs((firstDate.getTime() - secondDate.getTime())/(oneDay)));
})();

Wolfram alpha говорит, что 330 дней, diffDays1 показывает это 359. Это, вероятно, связано с летней экономией или чем-то. Есть ли способ точно рассчитать дни, так как не делает его серверной стороной.

Ответ 1

Проблема в том, что вы основываете месяц на 4 апреля, когда апрель - 3 в Javascript. См. Https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date#Parameters

var diffDays1=(function(){ 
    var oneDay = 24*60*60*1000; // hours*minutes*seconds*milliseconds
    var secondDate = new Date(new Date().getFullYear()+1,3,5);
    var firstDate = new Date();
    return Math.round(Math.abs((firstDate.getTime() - secondDate.getTime())/(oneDay)));
})();

Ответ 2

Зачем изобретать колесо? Используйте datejs

и после:

var startd = Date.parseExact(ind, "yyyy-MM-dd");
var endd = Date.parseExact(end, "yyyy-MM-dd");
var diff = new Date(endd - startd);
var days = diff/1000/60/60/24;

Что все люди!

Ответ 3

Библиотека moment.js(http://momentjs.com) обрабатывает эту и многие другие проблемы с датой JavaScript очень легко и красиво. Функция diff (http://momentjs.com/docs/#/displaying/difference/) будет делать именно то, что вы хотите.

Функция fromNow также очень приятна, если вы хотите отобразить количество дней с этого момента, вы можете сделать что-то вроде:

moment([2014, 4, 5]).fromNow();

произведет что-то вроде "330 дней", если он за 330 дней.

http://momentjs.com/docs/#/displaying/fromnow/

Ответ 4

Выбранное решение не работает, если день рождения в этом году, потому что он суммирует 1 для getFullYear.

Это мое решение, оно также предотвращает два крайних случая: день рождения сегодня и 1 день.

const birthdayDay = 19;
const birthdayMonth = 11; // december === 11
const myBirthdayThisYear = new Date(new Date().getFullYear(), 11, 19).setHours(23, 59, 59);

export const daysUntilBirthday = () => {
  const addToYear = myBirthdayThisYear > Date.now() ? 0 : 1;
  const oneDay = 24 * 60 * 60 * 1000;
  const secondDate = new Date(new Date().getFullYear() + addToYear, birthdayMonth, birthdayDay);
  const firstDate = new Date();
  const days = Math.round(Math.abs((firstDate.getTime() - secondDate.getTime()) / (oneDay)));
  const daysOrDay = days === 1 ? 'day' : 'days';
  return days !== 365 ? '${days} ${daysOrDay} until my birthday 😉😉' : '🎂 TODAY IS MY BIRTHDAY 🎂';
};

Ответ 5

Здесь используется более чистое решение, использующее момент, который правильно обрабатывает все случаи (включая сегодня, наступающий день рождения в этом году или не до следующего года, часовой пояс, високосный год и т.д.):

const birthdate = '2018-12-15';
const today = moment().format('YYYY-MM-DD');
const years = moment().diff(birthdate, 'years');
const adjustToday = birthdate.substring(5) === today.substring(5) ? 0 : 1;
const nextBirthday = moment(birthdate).add(years + adjustToday, 'years');
const daysUntilBirthday = nextBirthday.diff(today, 'days');

Простой, быстрый, точный!

Здесь тот же код, объясненный:

// This is the birthdate we're checking, in ISO 8601 format
const birthdate = '2018-12-15';

// Get today date in ISO 8601 format
const today = moment().format('YYYY-MM-DD');

// Calculate current age of person in years (moment truncates by default)
const years = moment().diff(birthdate, 'years');

// Special case if birthday is today; we do NOT need an extra year added
const adjustToday = birthdate.substring(5) === today.substring(5) ? 0 : 1;

// Add age plus one year (unless birthday is today) to get next birthday
const nextBirthday = moment(birthdate).add(years + adjustToday, 'years');

// Final calculation in days
const daysUntilBirthday = nextBirthday.diff(today, 'days');

Если сегодня день рождения, результат будет равен 0; если завтра, результат будет равен 1 и так далее.