Jak przekonwertować datę Moment.js na lokalną strefę czasową użytkowników?

84

Używam frameworków Moment.js i Moment-Timezone oraz mam obiekt daty Moment.js, który jest jawnie w strefie czasowej UTC. Jak mogę przekonwertować to na aktualną strefę czasową przeglądarki?

var testDateUtc = moment.tz("2015-01-30 10:00:00", "UTC"); var localDate = ???

Byłoby więc dobrze, gdybym mógł znaleźć lokalną strefę czasową użytkowników; lub alternatywnie chciałbym przekonwertować obiekt daty na inny obiekt danych, który po prostu używa „lokalnej strefy czasowej”, bez względu na to, co to właściwie jest.

oliver
źródło

Odpowiedzi:

140

Nie musisz do tego używać strefy czasowej. Główna biblioteka moment.js ma pełną funkcjonalność do pracy z czasem UTC i lokalną strefą czasową.

var testDateUtc = moment.utc("2015-01-30 10:00:00");
var localDate = moment(testDateUtc).local();

Stamtąd możesz korzystać z dowolnej funkcji, której możesz się spodziewać:

var s = localDate.format("YYYY-MM-DD HH:mm:ss");
var d = localDate.toDate();
// etc...

Zauważ, że przekazując obiekt testDateUtc, który jest momentobiektem, z powrotem do moment()konstruktora, tworzy on klon . W przeciwnym razie, gdy zadzwonisz .local(), zmieniłaby również testDateUtcwartość, a nie tylko localDatewartość. Chwile są zmienne .

Pamiętaj również, że jeśli oryginalne dane wejściowe zawierają przesunięcie strefy czasowej, takie jak +00:00lub Z, możesz po prostu przeanalizować je bezpośrednio za pomocą moment. Nie musisz używać .utclub .local. Na przykład:

var localDate = moment("2015-01-30T10:00:00Z");
Matt Johnson-Pint
źródło
4
Trzeba mieć świadomość, że metoda ta nie bierze pod uwagę przesunięcia czasu letniego, jest to bezpieczniejsze w użyciu moment-timezonebiblioteki
Jaime Agudo
2
@Jaime nie prawda. localrzeczywiście uwzględnia czas letni.
Matt Johnson-Pint
Możesz sam sprawdzić np. Tłumaczenie z ESTna CET, jutro podam przykład jak chcesz NY-> Madrid. Przyjmuję kontrprzykład :)
Jaime Agudo
1
masz rację, że chwila nie może wykonać tego typu konwersji bez momentu i strefy czasowej. Jednak może prawidłowo konwertować między UTC i lokalnym, o co poprosił OP.
Matt Johnson-Pint
2
Zasady lokalne pochodzą z przeglądarki. Tak długo, jak lokalna strefa czasowa obejmuje czas letni, moment będzie go używał.
Matt Johnson-Pint
23
var dateFormat = 'YYYY-DD-MM HH:mm:ss';
var testDateUtc = moment.utc('2015-01-30 10:00:00');
var localDate = testDateUtc.local();
console.log(localDate.format(dateFormat)); // 2015-30-01 02:00:00
  1. Określ format daty.
  2. Utwórz obiekt momentu i ustaw dla obiektu flagę UTC na wartość true.
  3. Utwórz zlokalizowany obiekt momentu przekształcony z oryginalnego obiektu momentu.
  4. Zwraca sformatowany ciąg ze zlokalizowanego obiektu momentu.

Zobacz: http://momentjs.com/docs/#/manipulating/local/

AndrewHenderson
źródło
Ta odpowiedź byłaby jeszcze lepsza, gdyby wyjaśniała, dlaczego to działa, być może z odniesieniami do dokumentacji. Możesz również chcieć wyjaśnić, czym różni się ta odpowiedź od tej opublikowanej w marcu ...
Heretic Monkey,
@AndrewHenderson, Czas wyprzedza o godzinę lokalny czas maszynowy. Dlaczego tak się dzieje?
Ramesh Papaganti
@RameshPapaganti Być może Daylight Savings? Na przykład PDT vs PST. Moment jest znany z tego, że zmienia API między wersjami, szczególnie jeśli chodzi o lokalizację. Daj mi znać, jeśli znalazłeś przyczynę.
AndrewHenderson
6

Oto co zrobiłem:

var timestamp = moment.unix({{ time }});
var utcOffset = moment().utcOffset();
var local_time = timestamp.add(utcOffset, "minutes");
var dateString = local_time.fromNow();

Gdzie {{ time }}jest sygnatura czasowa utc.

Sayan
źródło
3

Użyj funkcji utcOffset.

var testDateUtc = moment.utc("2015-01-30 10:00:00");
var localDate = moment(testDateUtc).utcOffset(10 * 60); //set timezone offset in minutes
console.log(localDate.format()); //2015-01-30T20:00:00+10:00
Alexey Ryazhskikh
źródło