繁体   English   中英

计算以前的星期日Javascript

[英]Calculating previous Sunday Javascript

我试图通过.setdate .getdate - 7天方法计算上一个星期日的日期,但它似乎完全适用于上周星期六计算但不适用于周日。 有任何想法吗?

 var today = new Date(); var yesterday = new Date(); var LWyesterday = new Date(); var LWSunday = new Date(); // Set yesturday date yesterday.setDate(today.getDate() - 1); console.log('yesterday = ' + yesterday); // Calculated and set Sunday var Sunday = new Date(today.getTime() - today.getDay() * 24 * 3600 * 1000); console.log('recent sunday = ' + Sunday); // Set yesturday last week LWyesterday.setDate(yesterday.getDate() - 7); console.log('last week yesterday = ' + LWyesterday); // Set sunday last week LWSunday.setDate(Sunday.getDate() - 7); console.log('last week sunday = ' + LWSunday); // returns Tue May 23 2017 14:08:24 GMT+0100 (GMT Summer Time) // Should have been Tue >**April**< 23 2017 14:08:24 GMT+0100 (GMT Summer Time) 

https://jsfiddle.net/afmc9yon/

您不必设置月份,因为setDate函数会自动处理:

https://www.w3schools.com/jsref/jsref_setdate.asp

Date.setDate(day) - 表示一个月中day的整数。

预期值为1-31,但允许使用其他值:

  • 0将导致上个月的最后一天
  • -1将导致前一个月的最后一天前一天

如果月份有31天:

  • 32将导致下个月的第一天

如果月份有30天:

  • 32将导致下个月的第二天

你需要的是:

  • getDay()返回星期几(星期日为0,星期一为1,星期六为6)

    • 你必须把它转换为Monay是1,...星期六是6,星期日是7
    • 你可以通过today.getDay() || 7进行转换 today.getDay() || 7 (从达米安借来)
    • 否则当今天是星期天时,代码会给你这个星期天作为上周的星期日
  • 你必须减少星期几( getDate() )到星期几( getDay()||7

所以在你的情况下使用: LWSunday.setDate(today.getDate() - (today.getDay()||7));

同样地,如果你想获得当前周的周日,那么你必须增加7天: Sunday.setDate(today.getDate() - (today.getDay()||7) + 7);

 var today = new Date(); var Sunday = new Date(); var LWSunday = new Date(); // Calculated and set Sunday Sunday.setDate(today.getDate() - (today.getDay()||7) + 7); console.log('recent sunday = ' + Sunday); // Set sunday last week LWSunday.setDate(today.getDate() - (today.getDay()||7)); console.log('last week sunday = ' + LWSunday); 

你也可以用它来创建一个函数:

 if (!Date.prototype.getSunday) Date.prototype.getSunday = function() { var dat = new Date(this.valueOf()); dat.setDate(dat.getDate() - (dat.getDay()||7) + 7); return dat; } if (!Date.prototype.getLastSunday) Date.prototype.getLastSunday = function() { var dat = new Date(this.valueOf()); dat.setDate(dat.getDate() - (dat.getDay()||7) ); return dat; } var date = new Date('2017-01-02'); console.log(date); console.log('this Sunday',date.getSunday()); console.log('last sunday',date.getLastSunday()); var date = new Date('2017-01-01'); console.log(date); console.log('this Sunday',date.getSunday()); console.log('last sunday',date.getLastSunday()); date = new Date('2017-05-02'); console.log(date); console.log('this Sunday',date.getSunday()); console.log('last sunday',date.getLastSunday()); date = new Date('2017-05-07'); console.log(date); console.log('this Sunday',date.getSunday()); console.log('last sunday',date.getLastSunday()); 

var now = new Date();
var daysBack = -7 + (7 - now.getDay());

console.log(
    new Date(now.getTime()  + ((daysBack || -7)*1000*60*60*24))
)

我们使用daysBack变量,这样我们就可以获得上周日,无论今天是星期几。 由于getDay()在星期日返回0,在星期一等返回1,我们使用如上所述的公式。 例如,如果今天是星期六而getDay()给我们6,我们这里有-7 +(7 - 6),然后是-7 + 1,我们得到-6,这意味着最接近的星期日是6天前。

daysBack || -7 daysBack || -7用于获取前一个星期日的情况今天也是星期天。

我刚刚注意到你的真正问题:周日可能是在上个月。 因此, Sunday.getDate() - 7是正数,而不是更改LWSunday Month属性...

所以你还需要改变月份(在某些情况下):

LWSunday.setDate(Sunday.getDate() - 7);
if(Sunday.getMonth()!==today.getMonth()){
   LWSunday.setMonth(LWSunday.getMonth()-1);
}
//same for year...
   console.log('last week sunday = ' + LWSunday);

或者你采取整个日期:

var LWSunday = new Date(Sunday.getTime() - 7*24*3600*1000);

http://jsbin.com/yevutabuxe/edit?console

SetDate()查找时间值输入的月份日期。 但是你试图通过外观找到整个日期值。 如果我理解你想要做什么,你真正想要的是:

    LWSunday.setTime(Sunday.getTime() - 7*24*60*60*1000);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM