使用jquery插件获取去年的周数

时间:2015-06-30 12:33:41

标签: javascript jquery

(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);

我已经编写了上面的代码,通过将参数传递给它来获得前一周的代码。但是假设在今年的前几个月这个等式不起作用它给了我负值。 需要解决方案才能获得适当的周数。去年.. 在此先感谢!!!!

1 个答案:

答案 0 :(得分:0)

如果我正确地阅读了你的问题,你的代码的意图是返回一个表示一年中一周的字符串,表示过去N周的日期。关于这一点的几件事。

  1. 修改常见对象的原型链是个坏主意。其他库可能会使用自己的实现进行覆盖,或者可能会导致对属性进行天真迭代时出现意外行为。最好提取为将日期作为参数的独立实用程序函数。

  2. 您在jQuery插件定义中声明了get_Week函数。这没有任何意义:您每次调用get_Week时都会重新定义$.getWeek()

  3. 同样,您正在修改jQuery的基础对象;如果你想扩展jQuery的功能,你应该创建一个插件,方法是将你的函数添加到$.fnhttps://learn.jquery.com/plugins/basic-plugin-creation/)。但同样,没有必要这样做。由于您实际上并没有使用jQuery做任何事情,因此独立函数也可以正常工作,并且需要更少的开销。

  4. 您的函数中有两个return语句。第二个将永远不会执行,我不清楚为什么它开始。我怀疑这是一个错字,以前的工作遗留下来的东西?

  5. 你正在做一些英勇的努力,通过花式毫秒数学来减去周数,但Date()构造函数只需传递适当的值就可以完成所有这些:

    < / LI>
      

    注意:Date被称为具有多个构造函数的构造函数   参数,如果值大于它们的逻辑范围(例如13是   作为月值提供或者为分钟值提供70),相邻   价值将被调整。例如。新日期(2013,13,1)相当于   新日期(2014,1,1) - MDN

    1. 您的“获取周”实施是非标准的。考虑修改以返回ISO8601 weeks

    2. 各种格式和非惯用的JavaScript用法。

    3. 确保您的最终实施包含大量测试用例。日期数学很容易出错,并且下面的代码不会超出您在控制台日志中看到的测试。

      /* 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>