【问题标题】:Javascript & JQuery - Weird new Date() IssueJavascript & JQuery - 奇怪的新 Date() 问题
【发布时间】:2011-09-09 02:49:46
【问题描述】:

我正在使用 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;

【问题讨论】:

    标签: javascript jquery datepicker


    【解决方案1】:

    您使用两位数表示月份中的某天:

    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 号时浪费了一些时间,之后一切都变得平淡无奇。

    我不确定这是否是您的具体问题,但这是一个需要解决的棘手问题。

    【讨论】:

    • 这完全解决了我的问题!当我在月底设计页面时,这绝对是一个令人讨厌的问题。
    • @user683946:真正令人讨厌的问题是parseInt 的第二个参数是可选的。但是现在你已经学会了艰难的方法,所以你不会忘记:)
    【解决方案2】:

    也许作者得到了院子里的报酬,例如将 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 );
    }
    

    【讨论】:

    • 感谢缩写函数,这将在我的代码中节省大量空间。我不知道你可以用那种风格做一个switchque语句。我有一种感觉,我这样做的方式非常草率。
    猜你喜欢
    • 2011-08-17
    • 2014-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-04
    相关资源
    最近更新 更多