moment.js에서 변경 가능성을 어떻게 해결합니까?


106

순간 객체의 초기 값을 저장해야하는 문제가 발생했지만 내 변수가 원래 객체와 함께 변경되는 것을 막는 데 문제가 있습니다.

불행히도 Object.freeze ()는 작동하지 않습니다. 형식을 지정하려고 할 때 moment.js가 "잘못된 날짜"오류를 반환하기 때문입니다.


3
그리고 코드는 ...? 초기 값을 저장하려면 valueOf 메서드를 사용하거나 숫자로의 암시 적 변환을 사용하여 사용할 수있는 시간 값을 저장합니다 .
RobG

이 설정되어, 당신의 변수가 설정되면, 그래서 오히려 다시는 다시하고 설정에 보면, 자동적으로 변경 실 거예요
존 스미스

답변:


184

frozen-moment 라는 NPM에 Moment.js 플러그인 이 있습니다 moment().freeze(). 대신 사용할 수 있습니다 Object.freeze(moment()).

그렇지 않으면 바닐라 Moment.js에는 clone가변성 문제를 피하는 데 도움 이되는 메서드가 있으므로 다음과 같이 할 수 있습니다.

var a = moment(),
    b = a.clone(); // or moment(a)

최신 정보:

이 답변을 쓴 지 2 년이 지났습니다. 이때 날짜 작업을위한 또 다른 라이브러리가 등장하여 많은 관심을 끌었습니다. https://date-fns.org/

이 라이브러리는 기본적으로 불변이며 모듈 식 기능 아키텍처를 따르므로 트리 쉐이킹 및 클라이언트 측 번들링에 더 적합합니다. 클라이언트 측에서 Webpack을 광범위하게 사용하는 프로젝트에서 작업 중이고 Moment.js가 빌드에 문제를 일으키는 것을 발견하거나 Moment.js의 가변성이 많은 골칫거리를 유발하더라도 date-fns시도 해야 합니다.


글쎄, 나는 fullCalendar 플러그인에서 moment.js를 사용하고 있으며 내가 예상했던 것보다 나중에 이벤트 상태에서 순간 객체 데이터를 얻는 것으로 나타났습니다. 하지만 변이성 문제는 분명 moment.js의 문제이므로 제안 해 주셔서 대단히 감사하고 시간을 낭비하여 죄송합니다.
Shengbo1618

24
moment변경하지 않고 저장된 변수를 조작 할 수 있습니다 . 다음과 같이 clone ()을 사용하십시오.zz = moment(); zz.clone().add(3, 'h').toISOString();
Quake1TF

5
date-fns는 시간대 지원이 매우 열악하며 UTC 날짜는 지원하지 않습니다.
mjuopperi

3
나는 한동안 사용 date-fns하고 있었지만 그 이후로 Moment와 boy를 사용하여 레거시 코드로 뛰어 들어야했습니다.이 게시물은 나를 창 밖으로 뛰어 내리는 것을 구했습니다.
Yuschick

dayjs불변의 특성을 가진 Moment.js와 유사한 API를 가지고 있기 때문에 좋은 대안입니다. (2019 년 3 월 현재 시간대 지원이 부족하지만 이것은 상당히 새로운 라이브러리이며 작업이 진행중인 것을 볼 수 있습니다.)
Tomoyuki Aota

2

내 의도가 아니기 때문에 뻔뻔한 자기 홍보에 대한 오래된 질문과 사과입니다. 누군가를 도울 수 있기를 바랍니다.

razorbeard가 말하는 것 외에도 (.clone() Moment.js가 기본적으로 제공되는 모든 것에 불변 메서드를 연결하는 NPM 모듈을 만들었습니다. 의도는 기존 코드를 깨뜨리는 것이 아니므로 모듈 Immu은 이름에 추가 된 새 메서드를 추가합니다.

모멘트 팩토리에 의해 반환 된 각 인스턴스는 불변 메서드로 장식됩니다. 예를 들어 moment().startOf()해당하는 startOfImmu(), 등 add()을 가질 것입니다 addImmu(). 각 인스턴스는 기존 모멘트를 수정하는 대신 새로운 모멘트를 반환합니다. 그것을 사용하려면 moment공장을 전달 momentImmutableMethods하여 새로운 불변 ​​메서드에 액세스하십시오. 예:

var moment = require('moment'); // or moment-timezone 
import { momentImmutableMethods } from 'moment-immutable-methods';

// to decorate instances with immutable methods we need to extend moment factory as below:
momentImmutableMethods(moment);

// now every instance returned by moment will have Immu methods attached.


// IMMUTABLE EXAMPLE
// we using immutable methods that were attached to every instance, these have Immu appended to original name
const ddd = moment({
  hour: 5,
  minute: 10
});
// Moment {_isAMomentObject: true, _i: {…}, _isUTC: false, _pf: {…}, _locale: Locale, …}
const eee = ddd.startOfImmu('day');
// Moment {_isAMomentObject: true, _i: {…}, _isUTC: false, _pf: {…}, _locale: Locale, …}
console.log(ddd === eee);
// false
const fff = eee.startOfImmu('month');
// Moment {_isAMomentObject: true, _i: {…}, _isUTC: false, _pf: {…}, _locale: Locale, …}
console.log(ddd === fff);
// false
console.log(eee === fff);
// false
console.log(ddd.format('DD/MM/YY HH:mma'));
// "14/04/18 05:10am"
console.log(eee.format('DD/MM/YY HH:mma'));
// "14/04/18 00:00am"
console.log(fff.format('DD/MM/YY HH:mma'));
// "08/04/18 00:00am"

NPM의 https://www.npmjs.com/package/moment-immutable-methods

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.