Як перетворити дату Moment.js на місцевий часовий пояс користувачів?


84

Я використовую фреймворки Moment.js та Moment-Timezone і маю об’єкт дати Moment.js, який явно вказаний у часовому поясі UTC. Як я можу перетворити це на поточний часовий пояс браузера?

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

Тож було б непогано, якби я міг дізнатись місцевий часовий пояс користувачів; Або ж я хотів би перетворити об'єкт дати в інший об'єкт даних, який просто використовує "місцевий часовий пояс", незалежно від того, що це насправді.

Відповіді:


139

Для цього не потрібно використовувати момент-часовий пояс. Основна бібліотека moment.js має повну функціональність для роботи з UTC та місцевим часовим поясом.

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

Звідти ви можете використовувати будь-яку функцію, яку ви можете очікувати:

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

Зверніть увагу , що при пропущенні testDateUtc, який є momentоб'єктом, назад в moment()конструктор, він створює клон . В іншому випадку, коли ви телефонуєте .local(), це також змінить testDateUtcзначення, а не лише localDateзначення. Моменти змінюються .

Також зауважте, що якщо вихідне введення містить зміщення часового поясу, таке як +00:00або Z, тоді ви можете просто проаналізувати його безпосередньо moment. Вам не потрібно використовувати .utcабо .local. Наприклад:

var localDate = moment("2015-01-30T10:00:00Z");

4
Ви повинні пам’ятати, що цей метод не враховує компенсацію літнього часу, безпечніше користуватися moment-timezoneбібліотекою
Хайме Агудо

2
@Jaime неправда. localдійсно враховує літній час.
Метт Джонсон-Пінт,

Ви можете перевірити самостійно, наприклад, перекладаючи з ESTна CET, я завтра наведу приклад, якщо ви хочете, як NY-> Madrid. Я прийму контраприклад :)
Хайме Агудо,

1
ви праві, що момент не може здійснити такий тип перетворення без моменту-часового поясу. Однак він може правильно конвертувати між UTC і local, про що запитував OP.
Метт Джонсон-Пінт,

2
Місцеві правила надходять із браузера. Отже, поки місцевий часовий пояс включає літній час, момент використовуватиме його.
Метт Джонсон-Пінт,

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. Визначте формат дати.
  2. Створіть моментний об'єкт і встановіть для прапора UTC значення true для об'єкта.
  3. Створіть локалізований моментний об'єкт, перетворений з початкового об'єкта моменту.
  4. Повернути відформатований рядок з локалізованого об’єкта моменту.

Див .: http://momentjs.com/docs/#/manipulating/local/


Ця відповідь була б ще кращою, якби вона пояснила, чому це працює, можливо, з посиланнями на документацію. Крім того, ви можете пояснити, чим ця відповідь відрізняється від відповіді, опублікованої в березні ...
Єретична мавпа

@AndrewHenderson, Час випереджає місцевий машинний час на годину. Чому це відбувається?
Рамеш Папаганті

@RameshPapaganti Можливо, літній час? Наприклад PDT проти PST. Відомо, що Moment змінює API між версіями, особливо коли мова йде про локалізацію. Повідомте мене, якщо ви знайшли причину.
AndrewHenderson

6

Ось що я зробив:

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

Де {{ time }}мітка часу utc.


3

Використовуйте функцію 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.