Как проигнорировать часовой пояс пользователя и вызвать Дату (), используют определенный часовой пояс

В приложении JS я получаю метку времени (eq. 1270544790922) с сервера (Ajax).

При базировании на той метке времени я создаю Date объектное использование:

var _date = new Date();
_date.setTime(1270544790922);

Теперь, _date декодируемая метка времени в текущем пользовательском часовом поясе локали. Я не хочу это.

Я хотел бы _date преобразовать эту метку времени в текущее время в городе Хельсинки в Европе (игнорирующий зону текущего времени пользователя).

Как я могу сделать это?

96
задан warpech 5 May 2010 в 09:00
поделиться

1 ответ

Базовое значение объекта Date фактически находится в формате UTC. Чтобы доказать это, обратите внимание, что если вы наберете new Date (0) , вы увидите что-то вроде: Wed Dec 31 1969 16:00:00 GMT-0800 (PST) . 0 рассматривается как 0 в GMT, но метод .toString () показывает местное время.

Большое примечание: UTC означает универсальный временной код. Текущее время прямо сейчас в 2 разных местах совпадает с UTC, но вывод может быть отформатирован по-разному.

Что нам здесь нужно, так это форматирование.

var _date = new Date(1270544790922); 
// outputs > "Tue Apr 06 2010 02:06:30 GMT-0700 (PDT)", for me
_date.toLocaleString('fi-FI', { timeZone: 'Europe/Helsinki' });
// outputs > "6.4.2010 klo 12.06.30"
_date.toLocaleString('en-US', { timeZone: 'Europe/Helsinki' });
// outputs > "4/6/2010, 12:06:30 PM"

Это работает, но ... вы не можете использовать какие-либо другие методы даты для своих целей, поскольку они описывают часовой пояс пользователя. Вам нужен объект даты, связанный с часовым поясом Хельсинки. На этом этапе вы можете использовать какую-то стороннюю библиотеку (я рекомендую это) или взломать объект даты, чтобы вы могли использовать большинство его методов.

Вариант 1 - сторонний, например, момент-часовой пояс

moment(1270544790922).tz('Europe/Helsinki').format('YYYY-MM-DD HH:mm:ss')
// outputs > 2010-04-06 12:06:30
moment(1270544790922).tz('Europe/Helsinki').hour()
// outputs > 12

Это выглядит намного элегантнее, чем то, что мы собираемся сделать дальше.

Вариант 2 - Взломайте объект даты

var currentHelsinkiHoursOffset = 2; // sometimes it is 3
var date = new Date(1270544790922);
var helsenkiOffset = currentHelsinkiHoursOffset*60*60000;
var userOffset = _date.getTimezoneOffset()*60000; // [min*60000 = ms]
var helsenkiTime = new Date(date.getTime()+ helsenkiOffset + userOffset);
// Outputs > Tue Apr 06 2010 12:06:30 GMT-0700 (PDT)

Он все еще думает, что это GMT-0700 (PDT), но если вы не будете слишком пристально смотреть, вы можете принять это за объект даты, который полезен для ваших целей. .

Я для удобства пропустил часть. У вас должна быть возможность определить currentHelsinkiOffset . Если вы можете использовать date.getTimezoneOffset () на стороне сервера или просто использовать некоторые операторы if, чтобы описать, когда произойдут изменения часового пояса, это должно решить вашу проблему.

Заключение - я думаю, что специально для этой цели вам следует использовать библиотеку дат, например момент-часовой пояс .

61
ответ дан 24 November 2019 в 05:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: