У меня есть веб-страница с тремя выпадающими списками для дня, месяца и года. Если я использую Date
конструктор JavaScript, который принимает числа, то я получаю Date
объект для моего текущего часового пояса:
new Date(xiYear, xiMonth, xiDate)
Дайте правильную дату, но она думает, что дата - GMT + 01: 00 из-за перехода на летнее время.
Проблема здесь в том, что я затем передаю это Date
методу Ajax, и когда дата десериализируется на сервере, она конвертируется в GMT и теряет час, который перемещает день назад на единицу. Теперь я могу просто передать день, месяц и год по отдельности в метод Ajax, но, похоже, должен быть лучший путь.
Принятый ответ указал мне верное направление, однако setUTCHours()
изменилось только само использование:
Apr 5th 00:00 GMT+01:00
в
Apr 4th 23:00 GMT+01:00
Затем я также должен был установить дату UTC, месяц и год, чтобы в конечном итоге
Apr 5th 01:00 GMT+01:00
что я и хотел
Ответы:
с помощью
.setUTCHours()
этого можно было бы фактически установить даты в UTC-времени, что позволило бы вам использовать UTC-время во всей системе.Вы не можете установить его, используя UTC в конструкторе, если только вы не укажете строку даты.Используя
new Date(Date.UTC(year, month, day, hour, minute, second))
вы можете создать объект Date из определенного времени UTC.источник
Этот ответ специально разработан для исходного вопроса и не даст того ответа, который вы обязательно ожидаете. В частности, некоторые люди захотят вычесть смещение часового пояса, а не добавить его. Помните, однако, что весь смысл этого решения состоит в том, чтобы взломать объект даты javascript для конкретной десериализации, а не быть правильным во всех случаях.
источник
*60*1000
в этом случае это понятнее; другими словами, это довольно очевидно, почему это там.Я считаю, что вам нужна функция createDateAsUTC (пожалуйста, сравните с convertDateToUTC )
источник
date
в часовой пояс UTC, но второй, кажется, не делает ничего полезного? (возвращает ту же дату, что иdate
)Date
Объект JavaScript всегда будет отражать эпоху Unix на основе UTC и местный часовой пояс. Симптом становится очевидным, когда вы вызываетеtoString
полученный объект даты и по-прежнему видите местный часовой пояс, даже если вы ожидали, что он будет в формате UTC.Date
объектом JavaScript . Еще один способ увидеть это здесь - этоDate.UTC
ожидание значений на основе UTC, и вы передаете им значения местного времени, и наоборот, с помощьюDate
конструктора.Просто установите часовой пояс и вернитесь в соответствии
источник
Я не верю, что это возможно - нет возможности установить часовой пояс для объекта Date после его создания.
И в некотором смысле это имеет смысл - концептуально (если, возможно, не в реализации); за http://en.wikipedia.org/wiki/Unix_timestamp (выделено мной):
После того, как вы его построите, он будет представлять определенную точку в «реальном» времени. Часовой пояс имеет значение только тогда, когда вы хотите преобразовать эту абстрактную точку времени в удобочитаемую строку.
Таким образом, имеет смысл, что вы сможете изменить только фактическое время, которое Date представляет в конструкторе. К сожалению, кажется, что нет никакого способа передать в явном часовом поясе - и конструктор, который вы вызываете (возможно, правильно), переводит ваши «локальные» переменные времени в GMT, когда он канонически сохраняет их - поэтому нет никакого способа использовать
int, int, int
конструктор для Время по ГринвичуС другой стороны, тривиально просто использовать конструктор, который принимает String. Вам даже не нужно конвертировать числовой месяц в строку (по крайней мере в Firefox), поэтому я надеялся, что наивная реализация сработает. Тем не менее, после его тестирования он успешно работает в Firefox, Chrome и Opera, но не работает в Konqueror («Неверная дата»), Safari («Неверная дата») и IE («NaN»). Я полагаю, у вас просто есть массив поиска для преобразования месяца в строку, например так:
источник
Я знаю, что это старый, но если это поможет, вы можете использовать момент и часовой пояс. Если вы не видели их, посмотрите.
http://momentjs.com/timezone/
http://momentjs.com/
две действительно удобные библиотеки манипулирования временем.
источник
Если вы хотите решить немного другую, но связанную проблему создания объекта Javascript Date из года, месяца, дня, ..., включая часовой пояс - то есть, если вы хотите проанализировать строку в Date - тогда вы по-видимому, надо сделать невероятно сложный танец
Таким образом, вы создаете «время UTC», используя дату без часового пояса (так что вы знаете, в каком он находится, а именно «локаль» UTC, а не локальное по умолчанию), а затем вручную применяете указанное смещение часового пояса.
Разве не было бы хорошо, если бы кто-то на самом деле думал об объекте даты Javascript более пяти минут ...
источник
для всех смещений местоположения Wiki Список смещений времени UTC
источник
getTimeZoneOffset является минусом для UTC + z.
источник
Это может помочь кому-то, поставить UTC в конце того, что вы передаете новому конструктору
По крайней мере в хроме можно сказать
var date = new Date("2014-01-01 11:00:00 UTC")
источник
+0000
(заметил, что пробел между 00 и UTC необходимо удалить), и это будет работать как в Firefox, так и в Chrome. Хотя не уверен в Safari. (Ссылка: stackoverflow.com/a/17545854/1273587 )Одноканальное решение
Вместо 1422524805305 используйте метку времени в миллисекундах. Вместо 330 используйте смещение часового пояса в минутах. GMT (например, Индия +5: 30 - 5 * 60 + 30 = 330 минут)
источник
источник
Самый простой способ найти правильную дату - использовать datejs.
http://www.datejs.com/
Я получаю свои даты через Ajax в следующем формате: «2016-01-12T00: 00: 00»
Консоль будет читать:
Пн Ян 11 2016 19:00:00 GMT-0500 (Восточное стандартное время)
Вт Янв 2016 2016 00:00:00 GMT-0500 (Восточное стандартное время)
https://jsfiddle.net/vp1ena7b/3/
«AddMinutes» происходит от datejs, вы, вероятно, можете сделать это в чистом js самостоятельно, но у меня уже есть datejs в моем проекте, поэтому я нашел способ использовать его, чтобы получить правильные даты.
Я думал, что это может кому-то помочь ...
источник
любой пробег в
источник
Этот код вернет ваш объект Date, отформатированный в часовом поясе браузера .
Редактировать:
Чтобы не загрязнять Date API, указанную выше функцию можно преобразовать в служебную функцию. Функция принимает объект Date и возвращает видоизмененный объект Date.
источник
Лучшее решение, которое я видел из этого, пришло от
http://www.codingforums.com/archive/index.php/t-19663.html
Функция печати времени
Пример полного кода
источник
Если вы хотите проверить разницу во времени между двумя датами, вы можете просто проверить, является ли второй часовой пояс меньшим или большим по сравнению с вашим первым желаемым часовым поясом, и вычесть или добавить время.
источник
GMT -03: 00 Пример
Или даже
источник
Это сработало для меня. Не уверен, что это хорошая идея.
источник
Я использовал пакет timezone-js.
источник
Это лучшее решение
С помощью:
Код:
Кофейная версия:
источник