Ошибка добавления даты и формата в момент js

#javascript #momentjs

Вопрос:

Я хотел бы добавить дни к определенной дате и отформатировать вывод. Итак, у меня есть следующее:

 addDays(date){
    return  moment(date).add(365, 'd').format("DD/MM/YYYY");
}
 

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

 console.log(addDays("24/05/2021")) //this returns invalid date
console.log(addDays("05/06/2021")) //returns 06/05/2022
 

В первой дате он возвращается invalid date , а во второй я ожидал, что он вернется 05/06/2022 , но он возвращает неправильную дату.

Чего мне не хватает, чтобы это работало. Мои даты указаны в формате dd/mm/yyyy

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

1. ваша дата, которую вы передаете, шаткая, см. Документы

2. В зависимости от того, что вы ожидаете от добавления 365 дней, ваш результат может составлять один день в високосные годы. Т.Е. добавление 365 дней к 2021-01-01 будет 2022-01-01. Но добавление 365 дней к 2020-01-01 будет 2020-12-31

Ответ №1:

Сбой происходит из-за momentjs невозможности проанализировать эту дату.

Вам нужно будет указать формат, который вы передаете:

 moment(inputDate, 'DD/MM/YYYY')
 

Документация MomentJS String Format


Пожалуйста, смотрите Ниже пример, который будет ожидаемым результатом:

 function addDays(inputDate){
  return moment(inputDate, 'DD/MM/YYYY').add(365, 'd').format("DD/MM/YYYY");
}
 
console.log(addDays("24/05/2021"));
console.log(addDays("05/06/2021")); 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"></script> 
 24/05/2022
05/06/2022
 

Тем не менее, я бы все же рекомендовал использовать moment().add(1, 'year') :

 function addDays(inputDate){
  return moment(inputDate, 'DD/MM/YYYY').add(1, 'year').format("DD/MM/YYYY");
}
 
 function addDays(inputDate){
  return moment(inputDate, 'DD/MM/YYYY').add(1, 'year').format("DD/MM/YYYY");
}
 
console.log(addDays("24/05/2021"));
console.log(addDays("05/06/2021")); 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"></script> 

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

1. Спасибо, это работает.

Ответ №2:

Так ли это? Если вы действительно хотите добавить год .add(1, 'year') , а не 365 дней.

Ответ №3:

Вы могли бы сделать это двумя способами: используя day и year

 let addNYears = function(years = 1, date) {
  return moment(date, 'DD/MM/YYYY').add(years, 'year').format("DD/MM/YYYY");
}

let addNDays = function(days = 1, date) {
  return moment(date, 'DD/MM/YYYY').add(days, 'day').format("DD/MM/YYYY");
}

console.log(addNYears(1, new Date())); //  1 year
// this is not the best way as each 4 years we have a leap year.
console.log(addNDays(365, new Date())); //  365 days
console.log(addNDays(5, new Date())); //  5 days 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js" integrity="sha512-qTXRIMyZIFb8iQcfjXWCO8 M5Tbc38Qi5WzdPOYZHIlZpzBHG3L3by84BBBOiRGiEb7KKtAOAs5qYdUiZiQNNQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>