Получение момента времени. Js, чтобы показать даты, соответствующие просмотру информации

Предыдущие ответы здесь указали мне на moment.js для обработки дат javascript, и я очень рад ее найти. Я могу хорошо разбираться и манипулировать.

Пользователи на моем веб-сайте просматривают информацию, относящуюся к различным физическим сайтам/местоположениям, и я хочу показать связанные с ней даты в то время, когда это место, а не местоположение пользователя.

Каждый физический сайт имеет строку атрибута часового пояса, такую ​​как "Европа/Лондон" или "Европа/Амстердам"

Мои даты сохраняются и доставляются из базы данных в формате UTC.

Есть ли простой способ сделать мой объект moment.js в любой заданный часовой пояс?

Ответ 1

Теоретически вы можете сделать что-то вроде этого.
moment.fn.formatInZone = function(format, offset) {
    return this.clone().utc().add('hours', offset).format(format);
}

moment().formatInZone('HH:mm:ss', 7);
moment().formatInZone('HH:mm:ss', -7);

Однако для этого требуется, чтобы вы знали правильное смещение, поэтому оно не учитывает летнее время.

Ответ 2

Если вы хотите отображать даты в ДРУГОЙ часовой пояс, чем пользователь на самом деле, то вам нужно начать поиск таких вещей, как https://bitbucket.org/pellepim/jstimezonedetect (если вам нужно определить, в каком часовом поясе находится пользователь) и https://github.com/mde/timezone-js, если вам нужно локализовать даты между зонами.

jsTimezoneDetect, с которым я связан выше, поможет вам составить краткий список соответствующих часовых поясов.

То, что у вас есть ваши данные, хранящиеся в UTC, сделают это довольно простым для вас благодаря mde/timezone-js.

Ответ 3

В node.js это на самом деле довольно просто, используя node -time (https://github.com/TooTallNate/node-time). Переопределите глобальный объект Date, а затем увеличьте moment.js:

var time = require('time')(Date),
    moment = require('moment');

moment.fn.setTimezone = function(timezone, relative) {
    this.toDate().setTimezone(timezone, relative);
    return this;
}

moment.fn.getTimezone = function() {
    return this.toDate().getTimezone();
}

Для хорошей меры вставьте функцию полезности для преобразования "входящих" строк даты/времени в UTC:

moment.fromTimezone = function(datetime, timezone) {
    return moment(datetime, "YYYY-MM-DD HH:mm").setTimezone(timezone, true).setTimezone("UTC");
}

И вы можете сделать это:

var fmt = "YYYY-MM-DD HH:mm",
    datetime = "2013-03-21 00:40",
    timezone = "Israel",
    m = moment.fromTimezone(datetime, timezone);

console.log(datetime, "in", timezone, "is", m.format(fmt), "in UTC");
console.log(m.format(fmt), "in UTC is", m.setTimezone(timezone).format(fmt), "in", m.getTimezone());

Выход оболочки:

$ node mtz.js
2013-03-21 00:40 in Israel is 2013-03-20 22:40 in UTC
2013-03-20 22:40 in UTC is 2013-03-21 00:40 in Israel
$