В каком формате эта временная метка и как я могу отформатировать ее в свое время

#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).