#javascript #timestamp
#javascript #временная метка
Вопрос:
У меня проблема с преобразованием временной метки в javascript.
У меня есть эта временная метка:
2011-10-26T12:00:00-04:00
Я пытался отформатировать ее так, чтобы она была удобочитаемой. Пока что он преобразует это, используя местное время моей системы вместо смещения GMT во временной метке. Я знаю, что часовой пояс, в котором это было создано, является EST. Я нахожусь в PST, поэтому время смещается на 3 часа.
Вместо этого отображается как:
Wednesday October 26, 2011 12:00 pm
Он отображается как:
Wednesday October 26, 2011 9:00 am
Я попробовал несколько разных решений, но последнее найдено здесь: http://blog.stevenlevithan.com/archives/date-time-format
Меня меньше волнует часть форматирования, поскольку я выясняю, как обрабатывать смещения GMT. Был бы признателен за любую помощь и понимание, которые кто-либо может предоставить.
Ответ №1:
Объекты даты создаются в локальной зоне. Если строка даты была создана в другом часовом поясе, вам необходимо настроить объект date, чтобы учесть разницу.
Сокращения PST и EST неоднозначны в Интернете, нет стандарта для сокращений часовых поясов, а некоторые представляют две или зоны. Вы должны выражать свою зону только в терминах /- UTC или GMT (что одно и то же, более или менее).
Вы можете получить смещение местного часового пояса, используя Date.prototype.getTimezoneOffset , который возвращает смещение в минутах, которое необходимо добавить к местному времени, чтобы получить UTC. Вычислите смещение для того места, где была создана строка времени, и примените его к созданному объекту даты (просто добавьте или вычтите разницу в минутах по мере необходимости).
Если ваш часовой пояс равен -3 часа, getTimezoneOffset вернет 180 для объекта даты, созданного в этой зоне. Если строка из зоны -4 часа, ее смещение равно 240. Итак, вы можете сделать:
var localDate = new Date('2011-10-26T12:00:00') // date from string;
var originOffset = 240;
var localOffset = localDate.getTimezoneOffset();
localDate.setMinutes( localDate.getMinutes() originOffset - localOffset );
Добавление смещения источника устанавливает его в UTC, вычитание локального смещения устанавливает его в местное время.
Было бы намного проще, если бы строка времени, отправленная сервером, была в UTC, таким образом, вы просто применяете локальное смещение.
Редактировать
IE не будет анализировать временную строку со смещением, а Chrome считает, что приведенная выше временная строка является UTC и настраивается на локальное смещение. Поэтому не позволяйте Date анализировать строку, делайте это вручную.
Комментарии:
1. Спасибо за ответ. Хотя то, что вы написали, напрямую мне, к сожалению, не помогло, ваша идея удалить смещение GMT и создать новый объект Date() из этого помогла. В моем конкретном случае мне нужно было только отобразить отформатированные временные метки, как если бы они были локальными. Итак, отключив GMT, я смог сделать это довольно легко. В конечном итоге мне вообще не нужно было беспокоиться о смещениях.
2. Отлично, если вы добрались туда в конце.
Ответ №2:
Неважно, в каком часовом поясе вы находитесь — временная метка приведет к различному местному времени для каждого часового пояса, но все они будут правильными, и любой, кто проверяет время UTC даты, получит ту же временную метку:
new Date('2011-10-26T12:00:00-04:00').toUTCString()
returns
Ср., 26 Окт. 2011 г. 16:00:00 GMT
и getTime() в любом месте возвращает одинаковую универсальную временную метку в миллисекундах: 1319644800000
Комментарии:
1. За исключением того, что некоторые браузеры не будут анализировать
2011-10-26T12:00:00-04:00
как допустимую строку даты. И по какой-то абсурдной причине Chrome считает, что строка UTC, поэтому будет скорректирована для местного часового пояса. Поэтому лучше не оставлять браузеру разбирать строку и делать это вручную.2. Точно. К счастью, моя среда js находится в Node, поэтому, к счастью, она относительно нормальная. Но в данном случае у него та же проблема, что и у Chrome (оба используют V8).