Почему я не могу добавить годы к дате с помощью MomentJS в своем приложении Angular?

Я работаю над приложением Angular, пытаясь использовать momentJS, чтобы добавить определенное количество лет к дате, но, похоже, это не работает.

Это мой код:

changeGuaranteeEndDate(guaranteeDuration) {
    console.log("changeGuaranteeEndDate() START");
    console.log("GUARANTEE START DATE: " + this.newAssetForm.value.guarantee_start_date);
    console.log("GUARANTEE DURATION: " + this.newAssetForm.value.guarantee_duration);
    console.log("EVENT VAL: " + guaranteeDuration);

    this.newAssetForm.value.guarantee_duration = guaranteeDuration;
    console.log("GUARANTEE DURATION: " + this.newAssetForm.value.guarantee_duration);

    let myMoment: moment.Moment = moment(this.newAssetForm.value.guarantee_start_date);
    console.log("myMoment: ", myMoment);

    let myMoment2 = myMoment;
    myMoment2.add(3, 'y')

    console.log("myMoment2: ", myMoment2);
}

Итак, в основном я создаю объект myMoment, начиная с даты, определенной в this.newAssetForm.value.guarantee_start_date.

Затем я пытаюсь создать новый объект myMoment2, начиная с myMoment, и добавляю к этому объекту 3 года. Наконец-то распечатаю

Проблема в том, что в консоли Chrome я получаю следующий вывод:

myMoment:  
Moment {_isAMomentObject: true, _i: Fri Jan 29 2021 13:04:29 GMT+0100 (Ora standard dell’Europa centrale), _isUTC: false, _pf: {…}, _locale: Locale, …}
_d: Mon Jan 29 2024 13:04:29 GMT+0100 (Ora standard dell’Europa centrale) {}
_i: Fri Jan 29 2021 13:04:29 GMT+0100 (Ora standard dell’Europa centrale) {}
_isAMomentObject: true
_isUTC: false
_isValid: true
_locale: Locale {_calendar: {…}, _longDateFormat: {…}, _invalidDate: "Invalid date", _dayOfMonthOrdinalParse: /\d{1,2}(th|st|nd|rd)/, ordinal: ƒ, …}
_pf: {empty: false, unusedTokens: Array(0), unusedInput: Array(0), overflow: -2, charsLeftOver: 0, …}
__proto__: Object

myMoment2:  
Moment {_isAMomentObject: true, _i: Fri Jan 29 2021 13:04:29 GMT+0100 (Ora standard dell’Europa centrale), _isUTC: false, _pf: {…}, _locale: Locale, …}
_d: Mon Jan 29 2024 13:04:29 GMT+0100 (Ora standard dell’Europa centrale) {}
_i: Fri Jan 29 2021 13:04:29 GMT+0100 (Ora standard dell’Europa centrale) {}
_isAMomentObject: true
_isUTC: false
_isValid: true
_locale: Locale {_calendar: {…}, _longDateFormat: {…}, _invalidDate: "Invalid date", _dayOfMonthOrdinalParse: /\d{1,2}(th|st|nd|rd)/, ordinal: ƒ, …}
_pf: {empty: false, unusedTokens: Array(0), unusedInput: Array(0), overflow: -2, charsLeftOver: 0, …}
__proto__: Object

Проблема в том, что, как видно из предыдущего вывода, кажется, что годы не были добавлены к исходному объекту myMoment.

Что не так с моим кодом? Что мне не хватает? Как правильно добавить годы к исходному объекту myMoment?


person AndreaNobili    schedule 29.01.2021    source источник
comment
ты пробовал console.log( this.newAssetForm.value.guarantee_start_date ) ? что он возвращает?   -  person Don Diego    schedule 29.01.2021
comment
Я только что создал кодовую ручку с почти такой же логикой, и она отлично там работает: codepen.io /Gh05d/pen/rNWNyvy?editors=1111   -  person Gh05d    schedule 29.01.2021
comment
Я считаю, что код работает нормально. Единственная проблема заключается в том, что вы создаете поверхностную копию объекта момента. и при добавлении года вы видите изменения в обеих переменных. Вы можете сделать let myMoment2 = myMoment.clone();, а затем добавить. вы увидите разницу.   -  person Nik    schedule 29.01.2021


Ответы (2)


Это работает для меня.... вы можете проверить это, нажав на Run code Snippet ниже.

Вы можете попробовать использовать ту же загруженную библиотеку из моего примера: src moment.min.js

function changeGuaranteeEndDate(guaranteeDuration) {
    console.log("changeGuaranteeEndDate() START");
    console.log("GUARANTEE START DATE: " + this.newAssetForm.value.guarantee_start_date);
    console.log("GUARANTEE DURATION: " + this.newAssetForm.value.guarantee_duration);
    console.log("EVENT VAL: " + guaranteeDuration);

    this.newAssetForm.value.guarantee_duration = guaranteeDuration;
    console.log("GUARANTEE DURATION: " + this.newAssetForm.value.guarantee_duration);

    let myMoment = moment(this.newAssetForm.value.guarantee_start_date);

    console.log("myMoment: ", myMoment);

    let myMoment2 = myMoment;
    myMoment2.add(3, 'y')

    console.log("myMoment2: ", myMoment2);
}

// This is just for Testing the function... and mocking object
changeGuaranteeEndDate.apply({
  newAssetForm:{
    value:{
      guarantee_start_date:new Date(),
      guarantee_duration:undefined
    }
  }
})
<script       src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"></script>

person Jose Marin    schedule 29.01.2021

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

console.log("myMoment2: ", myMoment2.format());
person Gh05d    schedule 29.01.2021
comment
Пожалуйста, избегайте ответа на вопрос, перенаправляя пользователя на ответ на другой вопрос. Вы можете сделать это в комментариях. - person Nik; 29.01.2021