Был ли у него день рождения в этом месяце или нет?

#javascript

#javascript

Вопрос:

 var monthDiff = today.getMonth() - pastdate.getMonth();
var hadBirthdayThisMonth = 
    (today.getMonth() > pastdate.getMonth()) ?
        true : (today.getMonth() < pastdate.getMonth()) ? 
            false : (today.getDate() > pastdate.getDate()) ?
                true : (today.getDate() < pastdate.getDate()) ? false : true;
if (!hadBirthdayThisMonth) monthDiff--;
  

С 20 августа 2011 года по 19 сентября 2011 года количество дней равно 60, и для меня это показывает 2 месяца, но я хочу показать это one месяц, пока не наступит его день рождения Sept 20th .

Я придумал вышеуказанную логику, но она не работает.

Комментарии:

1. Святой вложенный тернарный оператор, Бэтмен! O_O

2. Кроме того, в чем вопрос? Вы просто хотите знать, сколько месяцев до следующего дня рождения? Или просто был ли день рождения в этом месяце или нет?

3. «Я придумал вышеуказанную логику, но она не работает». — Интересно, почему 😉

4. А если он родился 31 числа месяца? Когда будет конец месяца? И будут ли люди, родившиеся 29 февраля, получать день рождения каждые 4 года?

Ответ №1:

 function isBDayInMonth(month, day) {
    var today = new Date(),
        birthDay = new Date(today.getFullYear(), month - 1, day, 0, 0, 0, 0); /*compose date*/

    return (birthDay.getMonth() - today.getMonth() === 0) ? {
        "msg": "this month",
        "days": parseInt((birthDay.getTime() - today.getTime()) / 864E5, 10) === 0 ? "tomorrow" : parseInt((birthDay.getTime() - today.getTime()) / 864E5, 10)   " days remaining"
    } : (birthDay.getMonth() - today.getMonth() === 1) ? {
        "msg": "next month",
        "days": parseInt((birthDay.getTime() - today.getTime()) / 864E5, 10)   " days remaining"
    } : (today.getMonth() > birthDay.getMonth()) ? {
        "msg": "in "   ((11 - today.getMonth())   birthDay.getMonth())   " months",
        "days": "many days remaining"
    } : {
        "msg": "in "   (birthDay.getMonth() - today.getMonth())   " months",
        "days": "many days remaining"
    };
}
  

Работает во всех случаях — просто возвращает объект с 2 реквизитами:

  • информация о месяце
  • информация о днях, число отображается, только если день рождения в следующем месяце

ДЕМОНСТРАЦИЯ

Ответ №2:

С 20 августа 2011 по 19 сентября 2011 количество дней составляет 60

Я думаю, что обычно считается, что это 30 или 31, если включено 20-е число.

и это показывает 2 месяца для меня,

«это»? Это всего лишь один месяц.

Есть много способов определить, находится ли одна дата в пределах одного месяца от другой, например

 function withinOneMonth(d0, d1) {

  // Copy dates so don't affect originals
  var t0 = new Date(d0);
  var t1 = new Date(d1);
  var t;

  // Get sense right
  if (t0 > t1) {
    t = t0;
    t0 = t1;
    t1 = t;
  }

  // Check if within moth
  t0.setMonth(t0.getMonth()   1);

  // Not inclusive. To make inclusive, use >=
  return t0 > t1;
}