(function($)
{
$.getWeek = function(backWeekupTo){
Date.prototype.get_Week = function() {
var onejan = new Date(this.getFullYear(), 0, 1);
return Math.ceil((((this - onejan) / 86400000) + onejan.getDay() + 1) / 7);
}
var weekNumber = (new Date()).get_Week();
var dayNames = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
var now = new Date();
var y = now.getFullYear();
weekrange = (y.toString() + "W" + (weekNumber-backWeekupTo));
return weekrange;
return this;
};
}(jQuery));
// and in controller
var prevWk = $.getWeek(23);
我已经编写了上面的代码,通过将参数传递给它来获得前一周的代码。但是假设在今年的前几个月这个等式不起作用它给了我负值。 需要解决方案才能获得适当的周数。去年.. 在此先感谢!!!!
答案 0 :(得分:0)
如果我正确地阅读了你的问题,你的代码的意图是返回一个表示一年中一周的字符串,表示过去N周的日期。关于这一点的几件事。
修改常见对象的原型链是个坏主意。其他库可能会使用自己的实现进行覆盖,或者可能会导致对属性进行天真迭代时出现意外行为。最好提取为将日期作为参数的独立实用程序函数。
您在jQuery插件定义中声明了get_Week
函数。这没有任何意义:您每次调用get_Week
时都会重新定义$.getWeek()
同样,您正在修改jQuery的基础对象;如果你想扩展jQuery的功能,你应该创建一个插件,方法是将你的函数添加到$.fn
(https://learn.jquery.com/plugins/basic-plugin-creation/)。但同样,没有必要这样做。由于您实际上并没有使用jQuery做任何事情,因此独立函数也可以正常工作,并且需要更少的开销。
您的函数中有两个return
语句。第二个将永远不会执行,我不清楚为什么它开始。我怀疑这是一个错字,以前的工作遗留下来的东西?
你正在做一些英勇的努力,通过花式毫秒数学来减去周数,但Date()
构造函数只需传递适当的值就可以完成所有这些:
注意:Date被称为具有多个构造函数的构造函数 参数,如果值大于它们的逻辑范围(例如13是 作为月值提供或者为分钟值提供70),相邻 价值将被调整。例如。新日期(2013,13,1)相当于 新日期(2014,1,1) - MDN
您的“获取周”实施是非标准的。考虑修改以返回ISO8601 weeks
各种格式和非惯用的JavaScript用法。
确保您的最终实施包含大量测试用例。日期数学很容易出错,并且下面的代码不会超出您在控制台日志中看到的测试。
/* NOTES:
* - All calculations are in local timezone. Consider revising to use UTC
* - The "week" implementation is nonstandard. Consider revising to
* return ISO8601 weeks: https://en.wikipedia.org/?title=ISO_8601#Week_dates
*/
var ONE_DAY = 24 * 60 * 60 * 1000;
var getWeek = function(d) {
var onejan = new Date(d.getFullYear(), 0, 1);
return Math.ceil((((d - onejan) / 86400000) + onejan.getDay() + 1) / 7);
};
console.log('week for 1-JAN-2015 should be `1`:', getWeek(new Date(2015, 0, 1)));
console.log('week for 30-JUN-2015 should be `27`:', getWeek(new Date(2015, 5, 30)));
console.log('FAIL: week for 2-JAN-2011 should be `52` (52nd week of 2010):', getWeek(new Date(2011, 0, 2)));
var subtractWeeks = function(weeks) {
var weeksAsDays = weeks * 7;
var today = new Date();
var pastWeek = new Date(today.getFullYear(), today.getMonth(), today.getDate() - weeksAsDays);
return pastWeek;
};
console.log('1 week ago as of 30-JUN-2015 should be `23-JUN-2015`:', subtractWeeks(1));
console.log('27 weeks ago as of 30-JUN-2015 should be `23-JUN-2015`:', subtractWeeks(27));
console.log('52 weeks ago as of 30-JUN-2015 should be `23-JUN-2015`:', subtractWeeks(52));
var getWeekRange = function(d){
var weekNumber = getWeek(d);
var y = d.getFullYear();
var weekrange = (y.toString() + "W" + weekNumber);
return weekrange;
};
console.log('week range for 1-JAN-2015 should be `2015W1`:', getWeekRange(new Date(2015, 0, 1)));
console.log('week range for 30-JUN-2015 should be `2015W27`:', getWeekRange(new Date(2015, 5, 30)));
var getPastWeekRange = function(weeksInPast) {
var pastDate = subtractWeeks(weeksInPast);
return getWeekRange(pastDate);
};
console.log('past week range for 1 week ago, as of 30-JUN-2015 should be `2015W26`:', getPastWeekRange(1));
console.log('past week range for 23 weeks ago, as of 30-JUN-2015 should be `2015W4`:', getPastWeekRange(23));
console.log('past week range for 52 weeks ago, as of 30-JUN-2015 should be `2014W27`:', getPastWeekRange(52));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>