DatePicker Дата выключена на один день - PullRequest
41 голосов
/ 01 марта 2012

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

Дата, отправленная на date_picker, 2012-03-21.Дата, возвращаемая программой выбора даты, - 20 марта 2012 года.

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

Ответы [ 12 ]

24 голосов
/ 01 марта 2012

Это не указатель даты,

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

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

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

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

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

DEMO

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

new Date (2012, 2, 21). 

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

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

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

20 голосов
/ 01 марта 2012

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

13 голосов
/ 27 июня 2013

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

d.setTime( d.getTime() + d.getTimezoneOffset()*60*1000 );
12 голосов
/ 13 декабря 2016

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

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

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

Лучший ответ, который я нашел, это этот стек-ответ .Ознакомьтесь с его «отличной рецензией».

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

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

7 голосов
/ 03 июня 2015

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

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 голосов
/ 10 июля 2015

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

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

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

2 голосов
/ 11 ноября 2016

После множества попыток у меня сработал следующий код, взятый из (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()));
}
1 голос
/ 03 ноября 2015
var myDate = $.datepicker.parseDate("yy-mm-dd", "2013-10-21");
..//do whatever with myDate now
1 голос
/ 14 июля 2015

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

0 голосов
/ 28 февраля 2019

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

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) .minutes (0) .seconds (0) .milliseconds (0), moment (). Вычитать (1, 'days'). Hours (23) .minutes (59) .seconds (59) .milliseconds (999)], 'Последние 7 дней': [момент (). Вычитать (6, 'дней'). Часы (0). Минуты (0) .секунды (0). Миллисекунды (0), момент (). Часы (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': [момент (). startOf ('месяц'). часов(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') .часов (23) .минут (59) .секунд (59) .миллисекунд (999)]},

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...