В моем приложении Java Script дата хранится в следующем формате:
2011-09-24
Теперь, когда я пытаюсь использовать указанное выше значение для создания нового объекта Date (чтобы я мог получить дату в другом формате), дата всегда возвращается на один выходной. Увидеть ниже:
var doo = new Date("2011-09-24");
console.log(doo);
журналы:
Fri Sep 23 2011 20:00:00 GMT-0400 (Eastern Daylight Time)
javascript
date
Levi
источник
источник
Ответы:
Обратите внимание, что восточное летнее время
-4 hours
и что часы в дату, когда вы возвращаетесь, являются20
.которая полночь 2011-09-24. Дата была проанализирована в UTC (GMT), потому что вы указали строку только для даты без индикатора часового пояса. Если бы вместо
new Date("2011-09-24T00:00:00")
этого вы указали строку даты / времени без индикатора ( ), он был бы проанализирован в вашем местном часовом поясе. (Исторически там были несоответствия, не в последнюю очередь потому, что спецификация менялась более одного раза, но современные браузеры должны быть в порядке; или вы всегда можете включить индикатор часового пояса.)Вы получаете правильную дату, вы просто не указали правильный часовой пояс.
Если вам нужен доступ к значениям даты, вы можете использовать
getUTCDate()
или любую другуюgetUTC*()
функцию :источник
EDT
это летнее время (также известное как летнее время) ,EST
это часовой пояс, который применяется в январе.new Date('2012-01-01 GMT')
он все равно применяет смещение, поскольку оно преобразует его в местное время пользователя.get*
методы и нуждаетесь в том, чтобы они возвращали правильную дату / время, включая неизвестное смещение часового пояса, просто добавьте неизвестное смещение часового пояса:d = new Date('2013-01-08 GMT'); d.setMinutes(d.getMinutes() + d.getTimezoneOffset());
это нормализует дату в соответствии с локалью пользователя, чтобы.get*
методы возвращали ожидаемое значение. Эти.getUTC*
методы затем будет неправильно, так что будьте осторожны.Есть несколько сумасшедших вещей, которые происходят с объектом JS DATE, который преобразует строки, например, рассмотрим следующую дату, которую вы указали
Если вы предоставите отдельные аргументы для конструктора Date, вы можете получить другие полезные результаты, как описано ниже
Примечание: аргументы могут иметь тип Number или String. Я покажу примеры со смешанными значениями.
источник
Чтобы нормализовать дату и устранить нежелательное смещение (проверено здесь: https://jsfiddle.net/7xp1xL5m/ ):
Это также выполняет то же самое и относится к @tpartee (протестировано здесь: https://jsfiddle.net/7xp1xL5m/1/ ):
источник
doo.setMinutes(doo.getMinutes() + doo.getTimezoneOffset())
Если вы хотите получить 0 часов некоторой даты в местном часовом поясе, передайте отдельные части даты
Date
конструктору.источник
Просто хочу добавить, что, очевидно, добавление пробела в конце строки будет использовать UTC для создания.
Изменить: это не рекомендуемое решение, просто альтернативный ответ. Пожалуйста, не используйте этот подход, так как очень неясно, что происходит. Есть несколько способов, которыми кто-то мог бы реорганизовать это случайно, вызывая ошибку.
источник
Я считаю, что это связано с настройкой часового пояса. Дата, которую вы создали, по Гринвичу, а по умолчанию - полночь, но ваш часовой пояс - EDT, поэтому он вычитает 4 часа. Попробуйте это, чтобы проверить:
источник
Ваша проблема конкретно с часовым поясом. Обратите внимание
GMT-0400
: вы на 4 часа отстали от GMT. Если вы добавите 4 часа к отображаемой дате / времени, вы получите ровно полночь 2011/09/24.toUTCString()
Вместо этого используйте метод, чтобы получить строку GMT:источник
Это, вероятно, не очень хороший ответ, но я просто хочу поделиться своим опытом с этой проблемой.
Мое приложение глобально использует дату utc в формате «ГГГГ-ММ-ДД», в то время как используемый мной плагин datepicker принимает только дату js, мне трудно учитывать и utc, и js. Поэтому, когда я хочу передать отформатированную дату «ГГГГ-ММ-ДД» в свой указатель даты, я сначала преобразовываю ее в формат «ММ / ДД / ГГГГ», используя moment.js или все, что вам нравится, и дата, отображаемая на устройстве выбора даты, теперь верный. Для вашего примера
Видимо d1 это то, что я хочу. Надеюсь, это будет полезно для некоторых людей.
источник
Это через меня за цикл, +1 на ответ zzzBov. Вот полное преобразование даты, которая работала для меня, используя методы UTC:
источник
Это значит
2011-09-24 00:00:00 GMT
, и так как вы находитесьGMT -4
, это будет20:00
предыдущий день.Лично я понимаю
2011-09-24 02:00:00
, потому что я живу вGMT +2
.источник
Хотя в случае OP временным поясом является EDT, нет гарантии, что пользователь, выполняющий ваш сценарий, будет находиться в часовом поясе EDT, поэтому жесткое кодирование смещения не обязательно будет работать. Решение, которое я нашел, разбивает строку даты и использует отдельные значения в конструкторе Date.
Обратите внимание, что вы должны учитывать еще одну причуду JS: месяц начинается с нуля.
источник
Именно с этой проблемой я столкнулся, когда мой клиент находился в Атлантическом стандартном времени. Значение даты, полученное клиентом, было «2018-11-23» и когда код передавал его в
new Date("2018-11-23")
выходные данные для клиента, было за предыдущий день. Я создал служебную функцию, как показано во фрагменте, который нормализовал дату, давая клиенту ожидаемую дату.date.setMinutes(date.getMinutes() + date.getTimezoneOffset());
источник
если вы просто хотите убедиться, что отдельные части даты остаются одинаковыми для целей отображения, * это работает, даже когда я меняю часовой пояс:
просто добавьте туда нули.
В моем коде я делаю это:
И я переключаю часовой пояс на моем компьютере, и дата остается той же, что и в строке даты гггг-мм-дд, которую я получаю из API.
Но я что-то упускаю / это плохая идея?
* по крайней мере, в хроме. Это не работает в Safari! на момент написания статьи
источник
.toISOString()
, это идет 1 день назад.new Date('2019/11/18 05:30:00').toISOString();
работал для меняЛучший способ справиться с этим без использования дополнительных методов преобразования,
Теперь просто добавьте GMT в свою дату, или вы можете добавить его.
Live: https://jsfiddle.net/gajender/2kop9vrk/1/
источник
Я столкнулся с такой проблемой, как эта. Но моя проблема была смещена при получении даты из базы данных.
это указано в базе данных и в формате UTC.
Поэтому, когда я получаю информацию из базы данных и проверяю дату, она добавляет смещение и отправляет обратно в javascript.
Это добавляет +05: 00, потому что это мой часовой пояс сервера. Мой клиент находится в другом часовом поясе +07: 00.
Так вот мое решение, что я делаю с этой проблемой.
Поэтому, когда дата приходит с сервера и имеет смещение сервера, я делю дату и удаляю смещение сервера, а затем преобразую в дату. Это решает мою проблему.
источник
если вам нужно простое решение для этого, смотрите:
источник
Вы используете формат строки даты ISO, который, согласно этой странице , приводит к построению даты с использованием часового пояса UTC:
Если вы форматируете текст по-другому, например
"Jan 01 1970"
, тогда (по крайней мере, на моем компьютере) он использует ваш местный часовой пояс.источник
Попытка добавить мои 2 цента к этой теме (уточняю ответ @ paul-wintz).
Сдается мне, что когда конструктор Date получает строку, которая соответствует первой части формата ISO 8601 (часть даты), он выполняет точное преобразование даты в часовом поясе UTC с 0 временем. Когда эта дата конвертируется в местное время, может произойти сдвиг даты, если полночь UTC является более ранней датой в местном часовом поясе.
Если строка даты имеет любой другой «более свободный» формат (использует «/» или дата / месяц не дополняется нулем), она создает дату в местном часовом поясе, поэтому проблема смещения даты отсутствует.
Итак, одно быстрое исправление, как упомянуто выше, состоит в замене «-» на «/» в вашей отформатированной в ISO строке только для даты.
источник
Храня
yyyy-mm-dd
в формате MySql Date, вы должны сделать следующее:источник
Ваш журнал выводит GMT, поэтому вы хотите указать свой часовой пояс:
источник
не обращайте внимания, не заметили GMT -0400, из-за которого дата была вчера
Вы можете попытаться установить время по умолчанию 12:00:00
источник
Следующее сработало для меня -
источник