Ответ 1
Кажется, это ошибка. Если строка, отправленная в Date(), отформатирована как 2012/03/21 вместо 2012-03-21. Дата кажется правильной.
Дата, возвращаемая при выборе даты, отключена на один день. Это проблема в моем коде или это ошибка?
Дата отправления 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));
Кажется, это ошибка. Если строка, отправленная в Date(), отформатирована как 2012/03/21 вместо 2012-03-21. Дата кажется правильной.
Это не датапикер,
console.log(new Date('2012-03-21')); //prints Tue Mar 20 2012 20:00:00 GMT-0400 (Eastern Daylight Time)
Объект Javascript Дата может принимать один из следующих синтаксисов, как показано ниже,
Итак, в вашем случае он будет называть dateString и parse. Поэтому попробуйте добавить время, указанное ниже,
new Date ('2012-03-21T00:00:00') //should return you Wed Mar 21 2012
или Лучше использовать, как показано ниже,
new Date (2012, 2, 21).
year - Целочисленное значение, представляющее год. Для совместимости (во избежание проблемы с Y2K) вы всегда должны указывать год полностью; используйте 1998, а не 98.
месяц. Целочисленное значение, представляющее месяц, начиная с 0 для января до 11 декабря.
день. Целочисленное значение, представляющее день месяца (1-31).
Вы можете добавить разницу к дате, которая будет по существу игнорировать любой часовой пояс.
d.setTime( d.getTime() + d.getTimezoneOffset()*60*1000 );
Это не ошибка, но определенно сбивает с толку.
Большинство ответов на этой странице сбиты с толку и содержат неверную информацию.
Реальная проблема заключается в том, как объект javascript Date
анализирует строки даты.
Лучший ответ, который я нашел, это этот стек-ответ. Проверьте его 'превосходную рецензию.
Ниже очень улокальный комментарий от ответа, упомянутого выше. (кредит: @Mizstik)
Все это происходит из-за поведения базового Date.parse(), который пытается следовать ISO 8601. Когда строка даты соответствует формату гггг-мм-дд, предполагается, что это ISO 8601 с неявным UTC 00:00. Когда строка отклоняется от формата (например, mm-dd-yyyy или косая черта вместо дефиса), она возвращается к более слабому анализатору в соответствии с RFC 2822, который использует местное время, когда часовой пояс отсутствует. По общему признанию, это все будет довольно загадочным для обычного человека.
Я не знаю, почему это работает, но то, что я нашел, - это использование косой черты или тире влияет на ответ. Посмотрите.
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, почему это произойдет и ответа не будет. Но это должно исправить вашу проблему. Все, что вам нужно сделать, это заменить дефисы косой чертой перед тем, как передать их туда, где вы хотите.
Изменить: извините, я не заметил уже принятый ответ перед публикацией, пожалуйста, не обращайте на него никакого ответа.
Это происходит из-за разницы во времени с форматом даты - 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 часов.
После нескольких попыток для меня был использован следующий код (fooobar.com/questions/2061/...)
function createDateAsUTC(date) {
return new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds()));
}
У меня нет репутации, чтобы комментировать, но Venu M дал мне хорошее представление. Мой проект имеет ту же проблему, когда в зависимости от синтаксиса ввода даты дата возвращается как вход или выход за один день. Расширяясь и просматривая полный формат даты, мои разные форматы входных данных возвращаются в UTC или в мой локальный часовой пояс, в зависимости от синтаксиса. Я использую Moment JS для анализа моих дат, а затем возвращаю объект даты для проверки с помощью Breeze. У меня есть либо мода ввода, либо таблица для редактирования, поэтому теперь мне нужно убедиться, что оба они разбираются и проверяются одинаково. Я предлагаю проверить, что ваш объект даты создается таким же образом, независимо от его входного синтаксиса или местоположения ввода.
var myDate = $.datepicker.parseDate("yy-mm-dd", "2013-10-21");
..//do whatever with myDate now
проверьте правописание .getFormatedDate
и измените его на .getFormattedDate
это тривиальное изменение, но настройте его и посмотрите, не появляется ли какое-либо приспособление.
После того, как вы столкнулись с такой же проблемой и посадкой на этой странице, оказалось, что в моем случае это было вызвано неправильной маркировкой дней. Я начал неделю в понедельник, а не в воскресенье. Надеюсь, это поможет кому-то.
Как сказано, 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]);
Попробуйте это,
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)] },