В приложении JS я получаю метку времени (экв. 1270544790922
) С сервера (Ajax).
На основе этой отметки времени я создаю Date
объект, используя:
var _date = new Date();
_date.setTime(1270544790922);
Теперь _date
декодированная временная метка в часовом поясе текущего пользователя. Я не хочу этого.
Я хотел бы _ date
преобразовать эту метку времени в текущее время в городе Хельсинки в Европе (без учета текущего часового пояса пользователя).
Как я могу это сделать?
javascript
date
timezone
варпеч
источник
источник
Ответы:
Базовое значение объекта Date фактически находится в формате UTC. Чтобы доказать это, заметим , что если вы печатаете
new Date(0)
вы увидите что - то вроде:Wed Dec 31 1969 16:00:00 GMT-0800 (PST)
. 0 рассматривается как 0 в GMT, но.toString()
метод показывает местное время.Большое примечание: UTC означает универсальный временной код. Текущее время прямо сейчас в 2 разных местах совпадает с UTC, но вывод может быть отформатирован по-разному.
Что нам здесь нужно, так это форматирование
Это работает, но .... вы не можете использовать какие-либо другие методы даты для своих целей, поскольку они описывают часовой пояс пользователя. Вам нужен объект даты, связанный с часовым поясом Хельсинки. На этом этапе вы можете использовать какую-нибудь стороннюю библиотеку (я рекомендую это) или взломать объект даты, чтобы вы могли использовать большинство его методов.
Вариант 1 - сторонний, например, момент-часовой пояс
Это выглядит намного элегантнее, чем то, что мы собираемся сделать дальше.
Вариант 2 - Взломать объект даты
Он по-прежнему считает, что это GMT-0700 (PDT), но если вы не будете слишком пристально смотреть, вы можете принять это за объект даты, который полезен для ваших целей.
Я удобно пропустил часть. Вы должны уметь определять
currentHelsinkiOffset
. Если вы можете использоватьdate.getTimezoneOffset()
на стороне сервера или просто использовать некоторые операторы if, чтобы описать, когда произойдут изменения часового пояса, это должно решить вашу проблему.Заключение - я думаю, что специально для этой цели вам следует использовать библиотеку дат, например, момент-часовой пояс .
источник
*60*60
что вместо этого должно быть*60000
, поскольку getTime находится в миллисекундах, а getTimezoneOffset - в минутах, из которых 60000 миллисекунд в минуте, а не 60 * 60 == 3600Чтобы учесть миллисекунды и часовой пояс пользователя, используйте следующее:
источник
Просто другой подход
Ура!
источник
new Date().getTimezoneOffset()
следует изменить наnew Date(timestampStr).getTimezoneOffset()
У меня есть подозрение, что ответ не дает правильного результата. В вопросе спрашивающий хочет преобразовать временную метку с сервера в текущее время в Hellsinki, не обращая внимания на текущий часовой пояс пользователя.
Дело в том, что часовой пояс пользователя может быть любым, поэтому мы не можем ему доверять.
Если, например. отметка времени - 1270544790922 и у нас есть функция:
Когда житель Нью-Йорка посещает страницу, alert (_helsenkiTime) печатает:
А когда финляндец посещает страницу, alert (_helsenkiTime) печатает:
Таким образом, функция верна только в том случае, если посетитель страницы имеет целевой часовой пояс (Европа / Хельсинки) на своем компьютере, но не работает почти во всех остальных частях мира. И поскольку отметка времени сервера обычно представляет собой отметку времени UNIX, которая по определению в UTC, количество секунд с начала эпохи Unix (1 января 1970 00:00:00 GMT), мы не можем определить DST или не-DST по отметке времени.
Таким образом, решение состоит в том, чтобы НЕ УЧИТЫВАТЬ текущий часовой пояс пользователя и реализовать какой-либо способ вычисления смещения UTC независимо от того, находится ли дата в летнем времени или нет. Javascript не имеет собственного метода для определения истории перехода на летнее время для другого часового пояса, кроме текущего часового пояса пользователя. Мы можем добиться этого проще всего, используя скрипт на стороне сервера, потому что у нас есть легкий доступ к базе данных часовых поясов сервера со всей историей переходов для всех часовых поясов.
Но если у вас нет доступа к базе данных часовых поясов сервера (или любого другого сервера) И метка времени находится в UTC, вы можете получить аналогичную функциональность, жестко закодировав правила DST в Javascript.
Чтобы охватить даты в 1998-2099 годах в Европе / Хельсинки, вы можете использовать следующую функцию ( jsfiddled ):
Примеры использования:
И это выводит следующее независимо от часового пояса пользователя:
Конечно, если вы можете вернуть метку времени в форме, в которой смещение (DST или не-DST) уже добавлено к метке времени на сервере, вам не нужно вычислять ее на стороне клиента, и вы можете значительно упростить функцию. НО не забывайте НЕ использовать timezoneOffset (), потому что тогда вам придется иметь дело с часовым поясом пользователя, а это нежелательное поведение.
источник
Предполагая, что вы получаете отметку времени по времени Хельсинки, я бы создал объект даты, установленный на полночь 1 января 1970 года по всемирному координированному времени (для игнорирования настроек локального часового пояса браузера). Затем просто добавьте к нему необходимое количество миллисекунд.
Остерегайтесь позже, чтобы всегда запрашивать значения UTC из объекта даты. Таким образом, пользователи будут видеть одни и те же значения даты независимо от локальных настроек. В противном случае значения даты будут смещены в соответствии с настройками местного времени.
источник
Вы могли бы использовать
setUTCMilliseconds()
источник
setUTCMilliseconds()
метод устанавливает миллисекунды для указанной даты по всемирному координированному времени. [...] Если указанный вами параметр находится за пределами ожидаемого диапазона,setUTCMilliseconds()
пытается соответствующим образом обновить информацию о дате в объекте Date. Другими словами, вы создаетеDate
объект с указанной меткой времени Unix в UTC.