2012-08-29 127 views
2

现在这个代码适用于明天和下个月 - 周末使用的工作,除了现在接近月底导致错误。我的startdate设置为8/31/12,enddate为8/34/12(在Sql中将其转换为DateTime时,会显示错误。)下周末的日期时间在JavaScript返回无效日期

我成功地在数学中添加一天,并且要添加一个月,但是在下个月增加几天的时间就会中断。我想我明白为什么这会发生,它是获得日期 - “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('/'); 
      } 

回答

0

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

如果再次打电话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/

+0

你的工作也很好,几乎一样,Marc B更快 –

+0

我认为Marc的答案是错误的 - 它试图产生一个月的特定日期在未来,不是包含整个下一个整月(即从1日开始)的范围。 – Alnitak

+0

是的,你得到它的权利 –

2

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

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

做这样的事情第一:

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

内部JS会适当调整日/月/年占“溢出”你会在每个周期结束时,仍然产生一个有效的日期。

+1

这可能是因为你没有在JavaScript聊天室谈论brony的,让你给我打个好答案 –

+0

d.setMonth(d.getMonth()的'结果+ 2)'如果新月比新旧月份短(例如,哪个日期是12月31日后的两个月?),会产生意想不到的结果 – Alnitak

+0

@alnitak:无论如何,月份是一个时髦的概念,尤其是当您处理二月份时。 –