2016-04-26 4 views
2

Это первый раз, когда я получаю этот результат.Почему новая дата, установленная сегодня, возвращает вчера

Я использую элемент управления Telerik RadDatePicker, и я назначаю дату на стороне клиента.

Дело в том, что управление не принимает строку в качестве даты, но объект Дата в JavaScript

Итак, мой код, чтобы установить дату в элементе управления является

var radDateControl = $find("radDateControl"); 
radDateControl.set_selectedDate(new Date('2016-04-26')); 

Но, Я понял, что новая дата возвращает дату как вчера! Зачем?

Это 5:58 вечера по восточному поясному времени (США & Канада) прямо сейчас. И если я делаю это

alert(new Date('2016-04-26')); 

Я получаю

Mon Apr 25 2016 20:00:00 GMT-0400 (Eastern Daylight Time) 

Почему и как я могу получить на следующий день, как сегодня.


Update

То, что я, наконец, сделал именно это. Надеюсь, это поможет другим.

var dateAsString = "2016-04-26"; 
var year = dateAsString.split('-')[0]; 
var month = dateAsString.split('-')[1]; 
var day = dateAsString.split('-')[2]; 
var date = new Date(Date.UTC(year, month - 1, day, 0,0,0)); 
date.setTime(date.getTime() + date.getTimezoneOffset() * 60 * 1000); 
rpdDateControl.set_selectedDate(date); 
+0

Эта дата, очевидно, анализируется как дата UTC в полночь, поэтому почему она кажется «вчера» вам в вашем часовом поясе Восточного времени, так как вы на 4 часа меньше UTC (с учетом DST). – ManoDestra

+0

Вы можете использовать универсальное время вместо локального времени, такого как var utcDate = new Date (Date.UTC (2016, 4, 26, 0, 0, 0)); –

+0

По-прежнему получать объект Date с часовым поясом! Это от консоли Chrome: новая дата (Date.UTC (2016,04,26,0,0,0)) ср. 25 мая 2016 20:00:00 GMT-0400 (восточное дневное время) –

ответ

2

Созданный объект даты абсолютно прав. Неправильная часть здесь или, по крайней мере, часть, запутанная вами, - это ваш браузер, анализирующий объект даты в ваш текущий часовой пояс.

Если вы создаете новый объект даты и сохранить его в переменной ...

var date = new Date('2016-04-26'); 

... вы получите то, что вы просили. Объект даты, представляющий 26/04/2016 (в UTC).

Поскольку вы используете свой браузер для получения значения объектов даты, значение просто анализируется через ваш часовой пояс (в вашем случае Eastern Daylight Time). Поэтому, если вы хотите обработать правильную дату, которую вы использовали для создания нового объекта даты, вы можете использовать .toUTCString().

Я знаю, разбор часовых поясов может быть очень расстраивающим. Чтобы обрабатывать различные часовые пояса, вы можете опробовать Moment или Moment Timezone. Думаю, момент должен соответствовать вашим потребностям, но только для завершения.

+0

Любопытно. Я тестировал то, что вы сказали мне в jsfiddle, и это сработало, но не в моем приложении. Я просто делаю то же самое в onload-событии окна, но моя дата переменной еще вчера! Я не могу использовать метод toUTCString(), потому что элемент управления, который я использую, принимает только объект Date, а не строку. –

+0

Не могли бы вы запустить код в этой скрипте на консоли разработчика браузеров? Конечно, выход был бы интересным. https://jsfiddle.net/os9raq9h/ – Aer0

+0

Да, это «Вт, 26 апреля 2016 00:00:00 GMT». Даже если я не использую toUTCString, он работает. Но в моем приложении это не так. Я использую VS2012, Embeeded IIS (ASP.NET Development Server) и Chrome. –

0

Просто используйте Date.now() вместо этого. Я не уверен, почему строка не работает, но это будет работать в любом случае.

+0

@ Aer0 на самом деле прав, но в любом случае будет работать. – Cameron637

0

Вы задаете дату 26, но с изменениями в часовом поясе она возвращает вам 2 часа, почему бы не просто alert(new Date()); и дать ей текущую дату ?, а также проверить ее на сервере, используя ssh и введите дату, если это не та дата, когда вы находитесь, вы можете использовать tzselect, чтобы изменить сервер на свою дату.

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