Установить предыдущий на основе месяца, пройденного динамически - PullRequest
1 голос
/ 04 мая 2020

В своей функции я передаю имя месяца в качестве параметра для получения данных. Мне нужно выполнить операцию: Get the first and last dates of the month previous to the month passed.

Я застрял в достижении того же.

Вот функция Dynami c, с которой я работаю:

module.exports = function (monthname) {
  const months = [
    "january",
    "february",
    "march",
    "april",
    "may",
    "june",
    "july",
    "august",
    "september",
    "october",
    "november",
    "december",
  ];

  const current = new Date();

  const month = months.indexOf(monthname.toLowerCase()) + 1;

  return {
    prev_month_first:
      new Date(Date.UTC(current.getFullYear(), month - 1, 1)) /
      1000,
    prev_month_last:
      new Date(Date.UTC(current.getFullYear(), month, 0)) / 1000,
  };
};

Контроллер. js

export_previous_month = (req, res) => {
const { monthname } = req.params;
  const previousMonth = getPreviousMonth(monthname);
  console.log('march exprected', new Date(previousMonth.prev_month_first * 1000), new Date(previousMonth.prev_month_last * 1000))
}

Предположим, я передал 'April' в качестве параметра для функции он должен вывести March 01 and March 31 как предыдущий месяц, соответствующий April. Но вместо этого он дает только первые и последние даты апреля. Если March передано как параметр, он должен вернуть первую и последнюю даты February.

Пожалуйста, помогите исправить проблему.

Ответы [ 3 ]

0 голосов
/ 04 мая 2020
module.exports = function (monthname) {
  const months = [
    "january",
    "february",
    "march",
    "april",
    "may",
    "june",
    "july",
    "august",
    "september",
    "october",
    "november",
    "december",
  ];

  const current = new Date(new Date(new Date().setDate(15)).setMonth(months.indexOf(monthname)));
  const prev_month_last = new Date(current.setDate(0));
  const prev_month_first = new Date(new Date(prev_month_last).setDate(1));  
  return {
    prev_month_first, prev_month_last
  };
};
0 голосов
/ 05 мая 2020

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

function getPreviousMonth(monthname) {
  let months = ["january","february","march","april","may","june",
    "july","august","september","october","november","december",
  ];
  let current = new Date();
  // Don't add 1 to month index
  let month = months.indexOf(monthname.toLowerCase());
  return {
    // Don't use Date.UTC, truncate decimal part
    prev_month_first:
      new Date(current.getFullYear(), month - 1, 1) / 1000 | 0,
    prev_month_last:
      new Date(current.getFullYear(), month, 0) / 1000 | 0      
  };
};

let timeValues = getPreviousMonth('march');

// Show timeValues (seconds)
console.log(timeValues);

// Show as dates
Object.keys(timeValues).forEach(key => 
   console.log(key + ': ' + new Date(timeValues[key]*1000).toString())
 );

Используя конструктор Date, как у вас, вы избегаете проблем со встроенным парсером (всегда хорошая идея), а также не связываетесь с текущий после того, как он создан, что помогает, и не вступайте в конфликт с месяцами разной продолжительности. Побеждает со всех сторон. : -)

О, и не связывайтесь с Date.UT C, так как тогда вы начнете создавать проблемы с часовыми поясами около полуночи ближе к концу месяца.

0 голосов
/ 04 мая 2020

Когда-либо слышали о момент js?

Посмотрите, как легко все может быть.

const getDate = (monthname) => {

  const months = moment.months().map(month => month.toLowerCase())

  const current = moment().subtract(1, 'months');

  const month = months.indexOf(monthname.toLowerCase()) + 1;

  return {
    prev_month_first: current.startOf("month").toDate(),
    prev_month_last: current.endOf("month").toDate()
  };

}

console.log(getDate("april"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.19.1/moment.min.js"></script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...