javascript - 奇怪的日期行为

标签 javascript date

使用以下代码,直到本周,该对象都返回一个包含“正确”周的下拉列表,即第 36 周为 9 月 5 日,第 37 周为 9 月 12 日,等等。

由于月份已更改为 10 月,因此现在返回的周数不正确。

来自 LEAP.Schedule 对象的代码:

    /* --- LEAP Namespace --- */
    var LEAP = {};

/* --- LEAP.Schedule Object --- */
    LEAP.Schedule = function(){//init
        this.weeks = [];
        this.calculateWeeks();
    };

    LEAP.Schedule.prototype.calculateWeeks = function(){
        this.date = new Date ( 2011, 8, 5 ); // First week of new school year
        this.num = 36; // Calendar number of this week
        this.weeks.push(new LEAP.Schedule.week(this.date, this.num));

        for (var i = 1; i < 51; i++) {
            var week = i * 7;
            var updated_date = new Date ();
            updated_date.setDate(this.date.getDate() + week);

            if (this.num > 51) {
                this.num = 0;
            }
            this.num++;

            this.weeks.push(new LEAP.Schedule.week(updated_date, this.num));
        }
    };

    LEAP.Schedule.prototype.getWeeks = function(){
        return this.weeks;
    };


/* --- LEAP.Schedule.week Object --- */
    LEAP.Schedule.week = function(n_date, n_week){
        this.week = n_week;
        this.date = n_date;

        this.year = this.date.getFullYear();
        this.month = this.date.getMonth();
        this.month += 1;
        this.day = this.date.getDate();

        var mydate = new Date(this.date);
        this.end_date = mydate.setDate(mydate.getDate() + 6);
    };

    LEAP.Schedule.week.prototype.getJSDate = function(){
        return this.date;
    };

    LEAP.Schedule.week.prototype.getStartDate = function(){
        return this.year + "-" + pad(this.month) + "-" + pad(this.day);
    };

    LEAP.Schedule.week.prototype.getEndDate = function(){
        end_of_week = new Date(this.end_date);

        var year = end_of_week.getFullYear();
        var month = pad(end_of_week.getMonth() + 1);
        var day = pad(end_of_week.getDate());

        return year + "-" + month + "-" + day;
    };

    LEAP.Schedule.week.prototype.getLabel = function(){
        return "Week " + this.week + ": " + this.day + (this.day==1||this.day==21||this.day==31?"st":this.day==2||this.day==22?"nd":this.day==3||this.day==23?"rd":"th") + " " + ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"][this.month-1] + " " + this.year;
    };

pad = function (n) {
    return n>9 ? n : "0"+n;
};

初始化/显示此对象的代码:

WeeklyUpdate.init = function() {
    var Scheduleobject = new LEAP.Schedule();
    var weeks = Scheduleobject.getWeeks();

    var dispHTML = '<p>weeks.length: ' + weeks.length + '</p>';

    for (var i = 0; i < weeks.length; i++) {
        if (i % 2 > 0) {
            dispHTML += '<div style="background:#ccc;">';
        } else {
            dispHTML += '<div style="background:#fff;">';
        }
        dispHTML += '<p>i: ' + i + '</p>';
        dispHTML += '<p>getJSDate: ' + weeks[i].getJSDate() + '</p>';
        dispHTML += '<p>getStartDate: ' + weeks[i].getStartDate() + '</p>';
        dispHTML += '<p>getEndDate: ' + weeks[i].getEndDate() + '</p>';
        dispHTML += '<p>getLabel: ' + weeks[i].getLabel() + '</p>';
        dispHTML += '</div>';
    }

    $('div#wrapper').html(dispHTML);

    //WeeklyUpdate.displayWeekFilter(weeks);
}

输出(三周后 trim ):

weeks.length: 51

i: 0

getJSDate: Mon Sep 05 2011 00:00:00 GMT+0100 (GMT Daylight Time)

getStartDate: 2011-09-05

getEndDate: 2011-09-11

getLabel: Week 36: 5th Sep 2011

i: 1

getJSDate: Wed Oct 12 2011 13:58:02 GMT+0100 (GMT Daylight Time)

getStartDate: 2011-10-12

getEndDate: 2011-10-18

getLabel: Week 37: 12th Oct 2011

i: 2

getJSDate: Wed Oct 19 2011 13:58:02 GMT+0100 (GMT Daylight Time)

getStartDate: 2011-10-19

getEndDate: 2011-10-25

getLabel: Week 38: 19th Oct 2011

我已经看过好几次了,但我感到很困惑!有任何想法吗?我确信这是非常明显的事情。

干杯

最佳答案

当您初始化new Date()时,它默认为当前日期。 getDate 仅指日,而不指月或年。您的代码在 9 月有效,因为那与开始月份相同,但由于现在是 10 月,您正在从错误的月份进行抵消。

var updated_date = new Date ();

应该是

var updated_date = new Date (2011, 8, 5);

这样您就可以从学年开始时开始抵消,而不是今天。

演示:http://jsfiddle.net/aXgk6/

关于javascript - 奇怪的日期行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7635325/

相关文章:

javascript - 如何使我的代码仅警报 'gggg' ,无法使用 jquery 删除第一个语句

javascript - 如何使用 JavaScript 在 x/y 位置绘制点

ruby-on-rails - Ruby 比较日期

javascript - 编写测试以更改子组件的 prop

javascript - JavaScript 中的内存访问

javascript - 向同一个对象字面量 javascript 添加不同的值

oracle - DD/MM/YYYY HH 的日期转换 :MM:SS to YYYYMM

java - 在 IReport 中显示为 oracle.sql 的日期

php - 时区正确,但时间不正确 - PHP MySQL

ruby - 在 Ruby 中获取本月的最后一天