我正在使用Keith Wood的jQuery datepicker http://keith-wood.name/datepick.html创建一个日历,用户可以使用该日历在一系列日期之间切换或选择单个日期。可以在http://www.hasslers.org查看网站本身。
日历效果很好,但计算天数成本时遇到问题。代码的工作方式是从datepicker中获取一个表示两个日期的字符串,并将它们分成单独的字符串。从那里,字符串信息被转换为表示日,月和年的单独变量。
当我使用警告窗口弹出它们时,变量都显示正确的值。我可以在任何开始日选择几乎并使脚本完美运行;但是,当我选择当前日期或新日期变量设置为10月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;
答案 0 :(得分:4)
也许作者可以通过院子获得报酬,例如将3个字母的月份缩写转换为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多行。
如果您发布日期字符串的格式,则可以非常简单地提供“天数差异”。由于夏令时可能会干扰,因此它可能不会仅仅除以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 );
}
答案 1 :(得分:4)
您使用的是当月的两位数字:
var day1 = dates[0].slice(8, 10);
var day2 = dates[1].slice(8, 10);
我不知道您的日期格式是什么,但如果第八个表示为08
那么您就遇到了麻烦。 parseInt
函数有第二个参数,用于指定数字的基数;如果你没有指定 radix 那么parseInt
将不得不猜测,如果给它一个以零开头的数字,它将猜测八进制。结果是parseInt('08')
将导致零,因为8
不是有效的八进制数字。使用parseInt
时,您应该始终指定基数。
今天方便第8天,让我们看看会发生什么。
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日时失去了一些时间,之后一切都在横向移动。
我不确定这是否是您的具体问题,但这是一个需要修复的难题。