2

我基本上只是无法弄清楚这一点,也不想破解它。

如果我一年这样做 52 周,它看起来会很乱。

有小费吗?

更新

这个问题与获取今年的当前周无关。

这个问题是关于自定义日期以来经过几周的时间。

我希望下周的锻炼出现在本周的第 6 天;)

例子

我从开始的日子是 99: 2018-05-30 18:39:29。

你的一些例子在第 15 周向我展示。

然而,我的代码显示第 16 周,这是正确的。看到警告了吗?

  calculateUsersCurrentWorkoutWeek: function(timestamp) {
            let daysSinceSignup = moment().diff(timestamp, "days");
            if (daysSinceSignup <= 6) {
              return 1;
            } else if (daysSinceSignup > 6 && daysSinceSignup <= 13) {
              return 2;
            } else if (daysSinceSignup > 13 && daysSinceSignup <= 20) {
              return 3;
            } else if (daysSinceSignup > 20 && daysSinceSignup <= 27) {
              return 4;
            } else if (daysSinceSignup > 27 && daysSinceSignup <= 34) {
              return 5;
            } else if (daysSinceSignup > 34 && daysSinceSignup <= 41) {
              return 6;
            } else if (daysSinceSignup > 41 && daysSinceSignup <= 48) {
              return 7;
            } else if (daysSinceSignup > 48 && daysSinceSignup <= 55) {
              return 8;
            } else if (daysSinceSignup > 55 && daysSinceSignup <= 62) {
              return 9;
            } else if (daysSinceSignup > 55 && daysSinceSignup <= 62) {
              return 10;
            } else if (daysSinceSignup > 62 && daysSinceSignup <= 69) {
              return 11;
            } else if (daysSinceSignup > 69 && daysSinceSignup <= 76) {
              return 12;
            } else if (daysSinceSignup > 76 && daysSinceSignup <= 83) {
              return 13;
            } else if (daysSinceSignup > 83 && daysSinceSignup <= 90) {
              return 14;
            } else if (daysSinceSignup > 90 && daysSinceSignup <= 97) {
              return 15;
            } else {
              return 16;
            }
          }
4

5 回答 5

11

除以 7 和 ceil?

const daysSinceSignup = moment().diff(timestamp, "days");
return Math.ceil(daysSinceSignup / 7);

你今天早上错过了咖啡吗?;-)


注意:上面的函数会告诉你“从那以后的周数timestamp”,这是我从你的文字中理解的,但你的代码示例并没有反映它。

要获得与代码示例相同的结果,您需要.floor()添加 1 而不是.ceil()

const daysSinceSignup = moment().diff(timestamp, "days");
return Math.floor(daysSinceSignup / 7) + 1;
于 2018-09-06T06:58:33.397 回答
2

正如@Michel 所说,除以 7 和 floor + 1

calculateUsersCurrentWorkoutWeek: function(timestamp) {
    let daysSinceSignup = moment().diff(timestamp, "days");
    return Math.floor(daysSinceSignup / 7) + 1;
}
于 2018-09-06T07:01:51.347 回答
2

简单的方法也可以是按升序创建一个整数数组,以便值包含比较的上限。然后对于每个值,daysSinceSignup您可以找到索引并添加1到​​它,因为您需要返回值,如1, 2, 3, ... 等等。如果您没有统一的间隔,这将很有用,就像目前间隔始终7如此,divisionandceil方法也可以工作,但如果间隔不统一,那么这种方法可能非常有用。

var indexArray = [6,13,20,27,34,41,48,55,62,69,76,83,90,97];
function calculateUsersCurrentWorkoutWeek() {
  let daysSinceSignup = 14;
  var elemIndex = indexArray.findIndex((item)=> item > daysSinceSignup);
  return elemIndex+1;
}
console.log(calculateUsersCurrentWorkoutWeek());

于 2018-09-06T07:03:23.750 回答
2

你正在寻找的是

return Math.ceil((daysSinceStartup + 1) / 7);

对于 -1 到 62 之间的任何实数,这将给出与您的代码相同的结果(因为在 62 左右您忘记替换复制的范围)。它返回 1 表示 6 天,返回 2 表示 6.01 天,就像原始代码一样。

于 2018-09-06T07:04:20.440 回答
0

您可以将数据放入数组并使用 array.find:

var datas = [
    { min: -Infinity, max: 6, ret: 1 },
    { min: 6, max: 13, ret: 2 },
    { min: 13, max: 20, ret: 3 },
    { min: 20, max: 27, ret: 4 }
];

function calculateUsersCurrentWorkoutWeek(daysSinceSignup) {
    return datas.find(({min, max}) => 
        daysSinceSignup > min && daysSinceSignup <= max
    ).ret;
}

console.log(calculateUsersCurrentWorkoutWeek(5));
console.log(calculateUsersCurrentWorkoutWeek(7));
console.log(calculateUsersCurrentWorkoutWeek(14));

于 2018-09-06T07:01:33.510 回答