Moment.js'de değişkenlik etrafında nasıl çalışırım?


107

Bir moment nesnesinin başlangıç ​​değerlerini saklamam gereken bir sorunla karşılaştım, ancak değişkenimin orijinal nesneyle birlikte değişmesini engellemekte bazı sorunlar yaşıyorum.

Ne yazık ki Object.freeze () çalışmıyor, çünkü moment.js bunu biçimlendirmeye çalıştığımda "Geçersiz tarih" hatası veriyor.


3
Ve kod ... gibi görünüyor? Başlangıç ​​değerini saklamak istiyorsanız, valueOf yöntemi veya örtük sayıya dönüştürme kullanılarak kullanılabilen zaman değerini saklayın .
RobG

Değişkeniniz bir kez ayarlandıktan sonra, otomatik olarak değişmeyecektir, bu yüzden tekrar tekrar ayarlamamayı tercih edin
john Smith

Yanıtlar:


185

Denilen NPM bir Moment.js eklentisi var dondurulmuş anı - Sen kullanabilirsiniz moment().freeze()yerine Object.freeze(moment()).

Aksi takdirde, vanilla Moment.js clonedeğişkenlik sorunlarından kaçınmanıza yardımcı olacak bir yönteme sahiptir, bu nedenle şöyle bir şey yapabilirsiniz:

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

GÜNCELLEME:

Bu cevabı yazalı iki yıl oldu. Bu süre zarfında, tarihlerle çalışmak için başka bir kütüphane ortaya çıktı ve çok ilgi gördü: https://date-fns.org/

Bu kitaplık varsayılan olarak değişmezdir ve modüler, işlevsel bir mimariyi izler, bu da ağaç sallama ve istemci tarafı paketlemeye daha uygun olduğu anlamına gelir. İstemci tarafında Webpack'i kapsamlı bir şekilde kullanan bir proje üzerinde çalışıyorsanız ve Moment.js'nin yapınızda sorun çıkardığını fark ederseniz veya Moment.js'nin değişkenliği size çok fazla baş ağrısına neden oluyorsa, o zaman siz vermelidir date-fnsbir deneyin.


Pekala, fullCalendar eklentisinde moment.js kullanıyorum ve görünüşe göre olayımın daha sonraki bir durumundan o an nesne verisini almam gerekenden daha fazla. Değişkenlik sorunları kesinlikle moment.js ile ilgili bir sorun, bu yüzden öneriniz için çok teşekkür ederim ve zamanınızı boşa harcadığım için üzgünüm.
Shengbo1618

24
Saklanan momentdeğişkeni değiştirmeden değiştirebilirsiniz : sadece clone () kullanın:zz = moment(); zz.clone().add(3, 'h').toISOString();
Quake1TF

5
Date-fns'nin çok zayıf saat dilimi desteğine sahip olduğunu ve UTC tarihlerini desteklemediğini unutmayın.
mjuopperi

3
Bir süredir kullanıyorum date-fnsama o zamandan beri Moment and boy kullanarak eski koda atlamak zorunda kaldım, bu gönderi beni bir pencereden atlamaktan kurtardı.
Yuschick

dayjsaynı zamanda, değişmez yapıya sahip Moment.js'ye benzer API'lere sahip olduğu için iyi bir alternatiftir. (Mart 2019 itibariyle, saat dilimi desteğinden yoksun ama bu oldukça yeni bir kütüphane ve çalışmaların devam ettiğini gözlemleyebiliyorum.)
Tomoyuki Aota

2

Bu eski bir soru ve utanmaz bir şekilde kendini tanıtmak için özür dilerim çünkü bu benim niyetim değil, sadece birine yardımcı olacağını umuyorum.

Razorbeard'ın söylediklerine ek olarak ( .clone()vb.) Moment.js'nin kutudan çıktığı her şeye değişmez yöntemler ekleyen NPM modülü yarattım. Amaç, mevcut kodu kırmak değildir, böylece modül Immu, adına eklenen yeni yöntemler ekler .

Fabrika tarafından döndürülen her örnek değişmez yöntemlerle dekore moment().startOf()edilecektir, örneğin karşılık gelen startOfImmu(), sahip add()olacak addImmu()vb. Bunların her biri, mevcut olanı değiştirmek yerine yeni anı döndürür. Bunu kullanmak için , yeni değişmez yöntemlere erişmek için momentfabrikayı momentImmutableMethodsgeçmeniz yeterlidir. Misal:

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"

Https://www.npmjs.com/package/moment-immutable-methods adresinde NPM'de

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.