В приложении JS я получаю метку времени (eq. 1270544790922
) с сервера (Ajax).
При базировании на той метке времени я создаю Date
объектное использование:
var _date = new Date();
_date.setTime(1270544790922);
Теперь, _date
декодируемая метка времени в текущем пользовательском часовом поясе локали. Я не хочу это.
Я хотел бы _date
преобразовать эту метку времени в текущее время в городе Хельсинки в Европе (игнорирующий зону текущего времени пользователя).
Как я могу сделать это?
Базовое значение объекта 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, чтобы описать, когда произойдут изменения часового пояса, это должно решить вашу проблему.
Заключение - я думаю, что специально для этой цели вам следует использовать библиотеку дат, например момент-часовой пояс .