Подтвердить что ты не робот

Datepicker date off на один день

Дата, возвращаемая при выборе даты, отключена на один день. Это проблема в моем коде или это ошибка?

Дата отправления date_picker - 2012-03-21. Дата, возвращаемая datepicker, - Tue Mar 20 2012.

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

Ответ 1

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

Ответ 2

Это не датапикер,

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

Объект Javascript Дата может принимать один из следующих синтаксисов, как показано ниже,

  • новая дата()
  • новая дата (миллисекунды)
  • новая дата (dateString)
  • новая дата (год, месяц, день [, час, минута, секунда, миллисекунда])

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

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

DEMO

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

new Date (2012, 2, 21). 

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

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

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

Ответ 3

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

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

Ответ 4

Это не ошибка, но определенно сбивает с толку.

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

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

Лучший ответ, который я нашел, это этот стек-ответ. Проверьте его 'превосходную рецензию.

Ниже очень улокальный комментарий от ответа, упомянутого выше. (кредит: @Mizstik)

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

Ответ 5

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

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, почему это произойдет и ответа не будет. Но это должно исправить вашу проблему. Все, что вам нужно сделать, это заменить дефисы косой чертой перед тем, как передать их туда, где вы хотите.

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

Ответ 6

Это происходит из-за разницы во времени с форматом даты - yyyy-mm-dd

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

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

Ответ 7

После нескольких попыток для меня был использован следующий код (fooobar.com/questions/2061/...)

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

Ответ 8

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

Ответ 9

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

Ответ 10

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

Ответ 11

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

Ответ 12

Как сказано, Javascript January равен 0, так что это сработает для datepicker или типа ввода date.

 end_date = end_date.split('-');
 end_date = new Date(end_date[0],Number(end_date[1])-1,end_date[2]);

Ответ 13

Попробуйте это,

ranges": {
    'Today': [moment().hours(0).minutes(0).seconds(0).milliseconds(0), moment().hours(23).minutes(59).seconds(59).milliseconds(999)],
    'Yesterday': [moment().subtract(1, 'days').hours(0).minutes(0).seconds(0).milliseconds(0), moment().subtract(1, 'days').hours(23).minutes(59).seconds(59).milliseconds(999)],
    'Last 7 Days': [moment().subtract(6, 'days').hours(0).minutes(0).seconds(0).milliseconds(0), moment().hours(23).minutes(59).seconds(59).milliseconds(999)],
    'Last 30 Days': [moment().subtract(29, 'days').hours(0).minutes(0).seconds(0).milliseconds(0), moment().hours(23).minutes(59).seconds(59).milliseconds(999)],
    'This Month': [moment().startOf('month').hours(0).minutes(0).seconds(0).milliseconds(0), moment().endOf('month').hours(23).minutes(59).seconds(59).milliseconds(999)],
    'Last Month': [moment().subtract(1, 'month').startOf('month').hours(0).minutes(0).seconds(0).milliseconds(0), moment().subtract(1, 'month').endOf('month').hours(23).minutes(59).seconds(59).milliseconds(999)]
},

диапазоны ": {       "Сегодня": [момент(). Часы (0). Минуты (0). Секунды (0). Миллисекунды (0), момент(). Часы (23). Минуты (59). Секунды (59). Миллисекунды ( 999)],       "Вчера": [момент(). Вычитать (1, "дни"). Часы (0). Минуты (0).секунды (0). Миллисекунды (0), момент(). Вычитать (1, "дни").hours(23).minutes(59).seconds(59).milliseconds(999)],       "Последние 7 дней": [момент(). Вычитать (6, "дней"). Часы (0).минуты (0).секунды (0).миллисекунды (0), момент(). Часы (23).минуты (59).seconds(59).milliseconds(999)],       "Последние 30 дней": [момент(). Вычитать (29, "дней"). Часы (0).минуты (0).секунды (0).миллисекунды (0), момент(). Часы (23).минуты (59).seconds(59).milliseconds(999)],       'This Month': [moment(). StartOf ('month'). Hours (0).minutes(0).seconds(0).milliseconds(0), moment(). EndOf ('month'). Hours ( 23).minutes(59).seconds(59).milliseconds(999)],       "Последний месяц": [момент(). Вычитать (1, "месяц"). StartOf ("месяц"). Часы (0). Минуты (0).секунды (0). Миллисекунды (0), момент(). вычитать (1, "месяц"). endOf ("месяц"). часы (23).минуты (59).секунды (59).миллисекунды (999)]   },