Javascript & JQuery - странная новая дата () выпуск - PullRequest
3 голосов
/ 09 сентября 2011

Я использую jQuery datepicker Кейта Вуда http://keith -wood.name / datepick.html , чтобы создать календарь, который пользователь может использовать для переключения между диапазоном дат или выбора отдельных дат.Сам сайт можно посмотреть по адресу http://www.hasslers.org.

. Календарь работает хорошо, как есть, но у него есть проблема с вычислением стоимости диапазона дней.Код работает так: он берет строку из указателя даты, представляющую две даты, и разбивает их на отдельные строки.Оттуда строковая информация преобразуется в отдельные переменные, представляющие день, месяц и год.

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

Достаточно моего бессвязного, вот фрагмент кода, который, похоже, нарушает спокойствие:

    var dates_string = datepicker_data.toString();

    var dates = dates_string.split(',');

    var day1 = dates[0].slice(8, 10);
    var day2 = dates[1].slice(8, 10);

    var month1 = dates[0].slice(4, 7);
    var month2 = dates[1].slice(4, 7);

    switch(month1) {
        case "Jan":
            month1 = 0;
            break;
        case "Feb":
            month1 = 1;
            break;
        case "Mar":
            month1 = 2;
            break;
        case "Aprl":
            month1 = 3;
            break;
        case "May":
            month1 = 4;
            break;
        case "Jun":
            month1 = 5;
            break;
        case "Jul":
            month1 = 6;
            break;
        case "Aug":
            month1 = 7;
            break;
        case "Sep":
            month1 = 8;
            break;
        case "Oct":
            month1 = 9;
            break;
        case "Nov":
            month1 = 10;
            break;
        case "Dec":
            month1 = 11;
            break;
    }

    switch(month2) {
        case "Jan":
            month2 = 0;
            break;
        case "Feb":
            month2 = 1;
            break;
        case "Mar":
            month2 = 2;
            break;
        case "Aprl":
            month2 = 3;
            break;
        case "May":
            month2 = 4;
            break;
        case "Jun":
            month2 = 5;
            break;
        case "Jul":
            month2 = 6;
            break;
        case "Aug":
            month2 = 7;
            break;
        case "Sep":
            month2 = 8;
            break;
        case "Oct":
            month2 = 9;
            break;
        case "Nov":
            month2 = 10;
            break;
        case "Dec":
            month2 = 11;
            break;
    }

    var year1 = dates[0].slice(11, 15);
    var year2 = dates[1].slice(11, 15);

    var split_date1 = new Date();
    var split_date2 = new Date();

    split_date1.setDate(parseInt(day1));
    split_date2.setDate(parseInt(day2));

    split_date1.setMonth(month1);
    split_date2.setMonth(month2);

    split_date1.setYear(parseInt(year1));
    split_date2.setYear(parseInt(year2));

    // get number of days by dividing by 86400000 milliseconds (number in a day)
    number_of_days = ((split_date2 - split_date1) / 86400000) + 1;

Ответы [ 2 ]

4 голосов
/ 09 сентября 2011

Вы используете две цифры для дня месяца:

var day1 = dates[0].slice(8, 10);
var day2 = dates[1].slice(8, 10);

Я не знаю, в каком формате ваши даты, но если восьмое представляется как 08, то у вас проблемы. Функция parseInt имеет второй аргумент, который задает основание числа; если вы не укажете radix , тогда parseInt придется угадывать, а если вы дадите ему число, начинающееся с нуля, он будет угадывать восьмеричное. В результате parseInt('08') приведет к нулю, поскольку 8 не является действительной восьмеричной цифрой. Вы должны всегда указывать основание при использовании parseInt.

Сегодня удобно восьмое, поэтому давайте посмотрим, что происходит.

var d = new Date();
// Thu Sep 08 2011 20:12:43 GMT-0700 (PDT)
d.setDate(parseInt('08'));
d.toString();
// "Wed Aug 31 2011 20:12:43 GMT-0700 (PDT)"

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

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

4 голосов
/ 09 сентября 2011

Возможно, автору платят во дворе, например, чтобы преобразовать трехбуквенную аббревиатуру месяца в число для даты JS:

function convertMonthToNumber(mon) {
  var months = {jan:0, feb:1, mar:2, apr:3, may:4, jun:5,
                jul:6, aug:7, sep:8, oct:9, nov:10, dec:11};
  return months[mon.toLowerCase()];
}

заменяет более 70 строк кода выше.1005 * Если вы публикуете формат строк даты, «разница в днях» может быть предоставлена ​​очень просто.Вероятно, он должен делиться не только на 8,64e7, так как летнее время может помешать.В любом случае, похоже, что ваша проблема с введенной датой, а не с фактическим расчетом.

Следующая функция вернет разницу в днях с двумя объектами даты.

function getDaysBetweenDates(d0, d1) {

  var msPerDay = 8.64e7;

  // Copy dates so don't mess them up
  var x0 = new Date(d0);
  var x1 = new Date(d1);

  // Set to noon - avoid time errors
  x0.setHours(12,0,0);
  x1.setHours(12,0,0);

  // Round to remove daylight saving errors
  return Math.round( (x1 - x0) / msPerDay );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...