2

现在这个代码适用于明天和下个月 - 周末使用,除了现在它接近月底它会导致错误。我的 startdate 设置为 8/31/12,enddate 设置为 8/34/12(在 Sql 中转换为 DateTime 时显然会引发错误。)

我正在成功地进行数学运算以添加一天和一个月,但是在将天数添加到下个月时它会中断。我想我明白为什么会这样,它正在获取日期-“29”将其转换为 int 然后添加-我想我会在 12 月的“下个月”遇到同样的问题。

我的问题是将日期添加到 javascript 日期的正确方法(或任何工作方式)是什么,它可以理解当月的日期。

        var d = new Date();
        var startdate;
        var enddate;

         if ($('._tomorrow').attr("checked") == "checked") {
                startdate = [d.getMonth() + 1, d.getDate() + 1, d.getFullYear()].join('/');
                enddate = [d.getMonth() + 1, d.getDate() + 2, d.getFullYear()].join('/');
            }
            if ($('._weekend').attr("checked") == "checked") {
                startdate = [d.getMonth() + 1, d.getDate() + 6 - d.getDay(), d.getFullYear()].join('/');
                enddate = [d.getMonth() + 1, ( d.getDate() + 6 - d.getDay()) + 2, d.getFullYear()].join('/');
            }
            if ($('._nextmonth').attr("checked") == "checked") {
                startdate = [d.getMonth() + 2, 1, d.getFullYear()].join('/');
                enddate = [d.getMonth() + 2, 29 , d.getFullYear()].join('/');
            }
4

2 回答 2

2

您需要构建一个新的日期对象,其中包含调整后的值。现在你只是取一些随机数并增加它们,例如

31+3/8/2012 -> 34/8/2012, not 3/9/2012

首先做这样的事情:

d.setMonth(d.getMonth()+ 2)

在内部,JS 将适当地调整日/月/年,以解决您在每个周期结束时造成的“溢出”,并且仍然产生有效日期。

于 2012-08-29T19:54:21.867 回答
0

要添加指定的天数,请创建一个新Date对象,然后使用d.setDate(d.getDate() + n)wheren是需要添加的天数。

如果您然后调用,getYear()您会再次发现它们都已“更正”为有效值:getMonth()getDate()

> d = new Date()
Wed Aug 29 2012 20:57:12 GMT+0100 (BST)
> [d.getDate(), d.getMonth() + 1]
[29, 8]
> d.setDate(d.getDate() + 10);
1347134232993
> [d.getDate(), d.getMonth() + 1]
[8, 9]

添加月份并不是那么简单,因为您需要定义下个月比当前月份短时会发生什么 - 例如,“1 月 31 日之后的一个月”是什么日期?

不过,计算下个月的开始很容易!

var now = new Date();
var start = new Date(now.getFullYear(), now.getMonth(), now.getDate());
var end   = new Date(now.getFullYear(), now.getMonth(), now.getDate());

if ($('._tomorrow').is(':checked')) {
    start.setDate(now.getDate() + 1);
      end.setDate(now.getDate() + 2);
} else if ($('._weekend').is(':checked')) {
    start.setDate(now.getDate() + 6 - now.getDay());
      end.setDate(now.getDate() + 8 - now.getDay());
} else if ($('._nextmonth').is(':checked')) {
    start.setDate(1);
      end.setDate(1);
    start.setMonth(now.getMonth() + 1);
      end.setMonth(now.getMonth() + 2);
}

var startStr = [start.getMonth() + 1, start.getDate(), start.getFullYear()].join('/');
var endStr = [end.getMonth() + 1, end.getDate(), end.getFullYear()].join('/');

http://jsfiddle.net/alnitak/nTSMg/

于 2012-08-29T19:54:41.950 回答