2015-01-24 10 views
30

Używam momentjsów i manipulowania datą przy użyciu moment.hour (xx) moment.minute (xx).Moment wewnętrzny obiekt, co to jest "_d" kontra "_i"

Kiedy i console.log w chwili, gdy widzę, że obiekt zawiera _d i _i: , _d zawiera poprawną zmienioną chwilę.hour() lub moment.minute() zmienia jednak obiekt _i zawiera oryginał?

k {_isAMomentObject: true, _i: Thu Dec 11 2014 20:34:00 GMT+0200 (South Africa Standard Time), _isUTC: false, _pf: Object, _locale: j…} 
_d: Thu Dec 11 2014 14:00:00 GMT+0200 
_i: Thu Dec 11 2014 20:34:00 GMT+0200 

Czy ktoś mógłby mnie oświecić?

Odpowiedz

56

Nie zwracaj na nie uwagi. Zamiast tego użyj różnych funkcji wyjściowych, takich jak .format(). See the Moment.js guidance on this topic.

Wewnętrzne momenty mają pewne dziwactwa ze względu na sposób działania obiektu Date. Wszystkie funkcje w publicznym interfejsie API biorą je pod uwagę, ale prawdopodobnie nie chcesz ich samodzielnie.

Wystarczy być kompletna chociaż będę opracowania na ich przeznaczenie:

  • _i jest wejście używany podczas tworzenia obiektu moment. Może to być ciąg, liczba, tablica lub obiekt Date.

    Jeśli jednak zostanie przesłany inny obiekt moment, _i zostanie skopiowany do tego momentu _i, a inne właściwości również zostaną skopiowane. _i nigdy nie będzie obiektem moment.

    _i może być również niezdefiniowana, w przypadku tworzenia bieżącego momentu z moment().

  • _d to instancja obiektu Date, który wspiera obiekt moment.

    Jeśli jesteś w "trybie lokalnym", to _d będzie mieć tę samą lokalną datę i godzinę, co obiekt z momentem, który jest wyświetlany z publicznym interfejsem API. Znaczniki czasu zwrócone przez getTime lub valueOf również będą zgodne.

    Jeśli znajdujesz się w "trybie UTC", to _d będzie nadal mieć tę samą datę i czas, co obiekt momentu z publicznym interfejsem API. Może to być mylące, ponieważ musiałbyś spojrzeć na getUTCDate i inne funkcje oparte na UTC na _d, aby zobaczyć je pasujące. Znaczniki czasu również będą się tutaj również dopasowywać.

    Jeśli zmieniłeś strefę czasową offset, z utcOffset, zone lub tz funkcji, wówczas wartość _d nie może pozostać sam. Musi również rozważyć, czy zdefiniowano _offset. Jeśli tak, to znacznik czasu wspierający obiekt _d musi zostać najpierw skorygowany o wartość przesunięcia. To zachowanie można zaobserwować w implementacji metody valueOfhere.

Jest to zachowanie dla tych dwóch pól od bieżącej wersji (2.10.6, jak to piszę).Istnieją jednak również inne pola, a ponieważ są to pola wewnętrzne, jest całkowicie możliwe, że zachowanie może się zmienić w przyszłej wersji. W szczególności zobacz issue #2616.

3

Jako uzupełnienie @ Matt odpowiedź:

Checkout ten wynik z konsoli Chrome:

date1 jest chwila ważny przedmiot:

Jak widać,. _d i ._i mają różne wartości. Więc lepiej użyj funkcji format() (jak napisał @Matt Johnson) wewnątrz twojego kodu źródłowego.