2014-07-01 3 views
2

У меня проблема с датами Javascript.Javascript, Date.parse без часовой пояс

Я получаю JSON, который содержит дату, когда я пытаюсь получить объект даты, он возвращает значение в другой часовой пояс и обычно переносит дату на день раньше в 20 часов.

Пример:

Значение в JSON является: "2014-06-01T00:00:00"

Когда я

var d2 = new Date(Date.parse("2014-06-01T00:00:00")) 

он возвращает

Сб май 31 2014 20:00:00 GMT-0400 (Восточное дневное время)

Когда я ожидал

Вс 1 июня 2014 00:00:00 GMT-0400

как я могу решить эту проблему?

спасибо

+0

Добро пожаловать в переполнение стека. Вы можете форматировать исходный код с помощью кнопки «{}» на панели инструментов. На этот раз я сделал это для вас. –

ответ

2

Date.parse возвращает количество миллисекунд, начиная с эпохи в UTC, поэтому независимо от того, какую строку даты/времени вы проходите, вы получите UTC. (См. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse для получения дополнительной информации.)

Если вы хотите скорректировать это по местному времени, вам нужно будет знать свое смещение от UTC.Вы можете получить, что с JavaScript таким образом:

var offset = new Date().getTimezoneOffset()*60*1000; 

(. Date.prototype.getTimezoneOffset возвращает смещение в течение нескольких минут, поэтому мы должны преобразовать в миллисекундах)

Тогда вы можете построить свою дату с этим смещением:

var date = new Date(Date.parse("2014-06-01T00:00:00") + offset); 

Если вы хотите интерпретировать эту дату так, как если бы она находилась в другом часовом поясе, вы просто использовали бы любое миллисекундное смещение, соответствующее этому часовому поясу. Помните о летних сбережениях: это определенно усложнит ситуацию.

1

Из документации Mozilla по Date.parse:

ECMAScript 5 ISO-8601 Поддержка формата

В качестве альтернативы/время Строка даты может быть в ISO формате 8601. Например, «2011-10-10» (только дата) или «2011-10-10T14: 48: 00» (дата и время) могут быть переданы и проанализированы. Часовой пояс UTC используется для интерпретации аргументов в формате ISO 8601, которые не содержат информацию о часовом поясе.

Ваше значение не включает информацию о часовом поясе, поэтому предполагается, что она находится в UTC. Полуночный UTC в этот день составляет 8 вечера в вашем местном часовом поясе. Обратите внимание, что объект Date не имеет понятия о часовом поясе сам по себе - это всего лишь миллисекунды с эпохи Unix. Когда вы конвертируете его в строку с toString, , то использует местный часовой пояс браузера. Вы можете использовать toUTCString для преобразования в текстовое представление с использованием UTC вместо этого (так что в этом случае вы закончите с полуночью UTC, с которой вы начали).

Теперь с точки зрения того, что вы можете сделать, чтобы «исправить» проблему ... вам нужно начать с понимания того, какое значение вы пытаетесь представить, и что вы хотите с ней делать. Мы не можем вам помочь с этим без дополнительной информации.

+0

Я думаю, что самым простым решением было бы добавить часовой пояс вручную для ввода строки. –

+0

@ ÁlvaroG.Vicario: Чтобы иметь * fix *, нам нужно было знать, что действительно пытается выполнить OP, - что на данный момент непонятно. –

Смежные вопросы