2012-03-01 5 views
33

Дата, отобранная по дате, отключена на один день. Это проблема в моем коде или это ошибка?datepicker date off by one day

Дата, отправленная на дату_пикер 2012-03-21. Дата возвращаемого DatePicker является Вт Мар 20 2012.

var end_date = end_calendar.getFormatedDate("%Y-%m-%d"); 
    end_date = $.datepicker.formatDate('D M dd yy', new Date(end_date)); 
+0

Вы уверены, что это относится к датепике? 'document.write (новая дата ('2012-03-21'))' prints 'Вт 20 мар 2012 20:00:00 GMT-0400 (Восточное дневное время)' для меня. Високосный год? –

+0

Что-то делать с форматированием, проверьте это: http://jsfiddle.net/fkSC5/ Передача '2012-03-21' и' 2012/03/21' на 'Date()' дает результаты, которые равны 4 часов. –

+0

Это правда. новая дата ('...') отключена на один день. – user823527

ответ

16

Кажется, это ошибка. Если строка, отправленная в Date(), отформатирована как 2012/03/21 вместо 2012-03-21. Дата кажется правильной.

+0

спасибо @ user823527 – Sohail

0

проверки правописания в .getFormatedDate и изменить его на .getFormattedDate это тривиальное изменение, но настроить его и посмотреть, если какие-либо результаты арматуры.

21

Это не DatePicker,

console.log(new Date('2012-03-21')); //prints Tue Mar 20 2012 20:00:00 GMT-0400 (Eastern Daylight Time) 

Javascript Date объект может принимать одно из следующего синтаксиса, как показано ниже,

  1. новой Даты()
  2. новой Даты (миллисекунды)
  3. новый Дата (датаString)
  4. новый год (год, месяц, день [, час, минута, secon d, миллисекунда])

Так что в вашем случае это будет называть dateString и parse. Так попробуйте добавить время, как показано ниже,

new Date ('2012-03-21T00:00:00') //should return you Wed Mar 21 2012 

DEMO

или лучше использовать, как показано ниже,

new Date (2012, 2, 21). 

год - значение Integer, представляющее год. Для совместимости (во избежание проблемы с Y2K) вы всегда должны указывать год полностью; используйте 1998 год, а не 98.

месяц - Целое число, представляющее месяц, начиная с 0 для января по 11 декабря.

day - Целочисленное значение, представляющее день месяца (1-31).

+1

Можете ли вы пролить свет на мои комментарии выше? Почему 'new Date ('2012-03-21)' возвращает дату с именем '20: 00: 00' и ​​является неправильным днем, когда вы указываете в первой строке своего сообщения? –

+2

@ Мадмартиган Я пытаюсь понять то же самое. Кажется, что новая дата ('2012-03-21T00: 00: 00') дает тот же результат, что и новая дата ('2012/03/21'). Однако у меня нет объяснений, если вы используете/по умолчанию время до 00:00:00 –

+0

вы можете рассмотреть http://stackoverflow.com/a/33494882/533426 – Toskan

11

Вы можете добавить разницу в дату, которая по существу игнорирует все, что связано с часовым поясом.

d.setTime(d.getTime() + d.getTimezoneOffset()*60*1000); 
+0

Спасибо, что помогли вам здесь http://stackoverflow.com/questions/32469269/javascript-date-give-wrong-date-off-by-one -хорошо я использую минус '-', и я использую текущее время, чтобы получить смещение часового пояса, подобное этому' d.setTime (d.getTime() - new Date(). getTimezoneOffset() * 60 * 1000); ' – Youssef

7

Я не знаю, почему это работает, но то, что я нашел, - это использование косой черты или тире влияет на ответ. Взглянуть.

new Date ('2012/03/21'); // returns: "Wed Mar 21 2012 00:00:00 GMT-0500 (CDT)" 
new Date ('2012-03-21'); // returns: "Tue Mar 20 2012 19:00:00 GMT-0500 (CDT)" WHA! 

Так, чтобы исправить мою проблему, я сделал простое регулярное выражение на моей дату ввода всегда заменить первую три черточки с слэшем.

var strInputValue = control.value, // <-- get my date string 
    dteCurrent; 

strInputValue = strInputValue.replace(/-/, '/') // replace 1st "-" with "/" 
          .replace(/-/, '/'); // replace 2nd "-" with "/" 

dteCurrent = new Date(strInputValue); 

Я сделал очень быстро поиск Google, почему это не случилось бы и нет ответа. Но это должно исправить вашу проблему. Все, что вам нужно сделать, это заменить дефисы косыми чертами перед тем, как передать их туда, где вы хотите.

Редактировать: извините, я не заметил уже принятого ответа перед публикацией, пожалуйста, не обращайте на это ответ.

+0

One комментария комментария объясняет, почему это так. Разница в формате, по-видимому, диктует Date, чтобы предположить, что некоторые значения равны нулю в UTC, что не так, когда вы используете косые черты – fayyazkl

+0

, это не работает для меня. даже если я заменю - с /, вывод такой же .. – amidstCloud

4

Это происходит из-за разницы в часовом поясе с датой Формат- гггг-мм-дд

new Date ('2015/07/10'); // returns: "Fri Jul 10 2015 00:00:00 GMT-0700 (Pacific Daylight Time)" 

new Date ('2012-07-10'); // returns: "Thu Jul 09 2015 17:00:00 GMT-0700 (Pacific Daylight Time)" 

yyyy/mm/dd - не считая часовой пояс при расчете местного time.But
yyyy-mm-dd - рассматривает время при расчете местного время в функции даты java script.
Это может быть воспроизводимым, когда клиентские (браузерные) и часовые пояса сервера отличаются друг от друга и имеют разницу в часовом поясе/дате на 1 день.

Вы можете попробовать это на своей машине, изменив время на различные часовые пояса, где время пробега должно быть> = 12 часов.

0

У меня нет репутации комментатора, но Venu M дал мне хорошее представление. Мой проект имеет ту же проблему, когда в зависимости от синтаксиса ввода даты дата возвращается как вход или выход за один день. Расширяясь и просматривая полный формат даты, мои разные форматы входных данных возвращаются в UTC или в мой местный часовой пояс, в зависимости от синтаксиса. Я использую Moment JS для анализа моих дат, а затем возвращаю объект даты для проверки с помощью Breeze. У меня есть либо мода ввода, либо таблица для редактирования, поэтому теперь мне нужно убедиться, что оба они разбираются и проверяются одинаково. Я предлагаю проверить, что ваш объект даты создается таким же образом, независимо от его входного синтаксиса или ввода.

1
var myDate = $.datepicker.parseDate("yy-mm-dd", "2013-10-21"); 
..//do whatever with myDate now 
0

После того, как вы столкнулись с той же проблемой и приземлились на этой странице, оказалось, что в моем случае это было вызвано неправильной маркировкой дней. Я начал неделю в понедельник, а не в воскресенье. Надеюсь, это поможет кому-то.

1

После попытки много решений следующего код работал для меня взят из (https://stackoverflow.com/a/14006555/1736785)

function createDateAsUTC(date) { 
    return new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds())); 
} 
4

Большинство ответов на этой странице перепутаны и содержат некоторую неправильную информацию.

Настоящая проблема заключается в том, как объект javascript Date обрабатывает строки даты.

Лучший ответ, который я нашел, - this stack-O answer. Проверьте его «отличную рецензию».

Ниже приведено очень уместное замечание из упомянутого выше ответа. (Кредит: @Mizstik)

Все это связано с поведением, лежащей в основе Date.parse() пытается следовать ISO 8601. Когда строка даты соответствует формату гггг-мм-дд, это предполагается быть ISO 8601 с неявным UTC 00:00. Когда строка отклоняется от формата (например, mm-dd-yyyy или косой черты вместо дефиса), он возвращается к свободному парсеру в соответствии с RFC 2822, который использует локальное время, когда часовой пояс отсутствует. По общему признанию, все это будет довольно загадочным для обычного человека.