【问题标题】:Generate random date but exclude some dates from array in javascript生成随机日期,但从 javascript 中的数组中排除某些日期
【发布时间】:2020-12-11 18:31:32
【问题描述】:

我有一个名为 dates 的数组,其中包含一些日期。我想排除这些日期并生成一个从今天开始的新随机日期。

dates = [20/2/2020,10/2/2019] //需要排除日期

到目前为止,我已经尝试过了,

        var new_dif =  Math.random(); //generates random number
        
        var daea = new Date(new_dif); //new random date
        
        alert(daea); //generates new date with year 1970

【问题讨论】:

  • 选项 1:创建一个循环重试随机值,直到滚动非排除值。选项 2:如果我想要一个 1 到 10 之间的随机数,而没有 5 和 7,那么你基本上想要生成一个 1 到 8 之间的随机数,如果它 >=5 然后添加 1,如果它 >= 添加另一个 1 . 这样一来,5 是 6,6 是 8,7 是 9,8 是 10,您可以尝试根据自 1970 年以来的随机滚动日期并排除某些日子来调整它。
  • @luk2302 我发表的评论给出了这样的结果“1970 年 8 月 22 日星期六 22:20:58 GMT+0530(印度标准时间)”。但我想排除数组中的其他日期,然后生成新日期。
  • 查看DateMath.random 的文档。 Date 构造函数将采用一个表示 unix 时间戳的整数。 Math.random 返回一个 0-1 的浮点数。有一些示例 here 描述了如何创建具有最小值和最大值的随机数。

标签: javascript arrays datetime arraylist random


【解决方案1】:

您可能想尝试这样的事情(在未来一年的某个地方设置随机日期)。

const now = (new Date()).getTime();
const newDiff = parseInt(Math.random() * 1000 * 60 * 60 * 24 * 365, 10);
const otherDate = new Date(now + newDiff);
console.log(otherDate);

然后,您需要检查排除的数组,看看它们是否匹配。如果没有,那么您可以使用它。

或者当使用循环时:

function getRandomDate() {
  var now = Date.now();
  var newDiff = parseInt(Math.random() * 1000 * 60 * 60 * 24 * 365, 10);
  var otherDate = new Date(now + newDiff);
  return otherDate;
};



var excludedDates = ['2020-02-20', '2019-02-10'];

var duplicate = true;
while (duplicate) {
  var getMyDate = getRandomDate();
  duplicate = false;
  excludedDates.forEach((excludedDate) => {
    var excludedInMs = (new Date(excludedDate)).getTime();
    if (excludedInMs === getMyDate) {
      duplicate = true;
    }
  });
  if (!duplicate) {
    console.log('while >>>>', getMyDate);
  }
}

【讨论】:

  • 如果它们匹配,你会怎么做?
  • 那么你需要在一个函数中设置我的例子并重新运行它并重新检查新的随机日期是否再次匹配。
  • 所以我对这个问题的评论的选项 1:循环直到你找到一个不冲突的日期!?
  • 你能帮我处理一下循环吗?我应该如何排除日期数组中的日期。
【解决方案2】:
  1. 从今天开始创建随机日期
  2. 有while循环,生成的检查已经存在于排除日期数组中(继续循环,直到找到不在日期数组中的日期)

const randomDateFromToday = (exclude_dates, max_days = 365) => {
  const randomDate = () => {
    const rand = Math.floor(Math.random() * max_days) * 1000 * 60 * 60 * 24;
    const dat = new Date(Date.now() + rand);
    return `${dat.getDate()}/${dat.getMonth() + 1}/${dat.getFullYear()}`;
  };
  let rday = randomDate();
  while (exclude_dates.some((date_str) => date_str === rday)) {
    rday = randomDate();
  }
  return rday;
};

dates = ["20/2/2020", "10/2/2019"];
console.log(randomDateFromToday(dates));
console.log(randomDateFromToday(dates));

【讨论】:

  • 直截了当,易于实施,感谢它的工作!!!
  • 这个函数的使用应该有一些注意事项。 while 循环意味着当数组中的元素数量接近 max_days 的值时它会迅速变得低效,并且当元素数量等于max_days + 1 时变成无限循环。
【解决方案3】:

如果我想建议下一个不是随机的而是数组中最接近的日期怎么办?

【讨论】:

    猜你喜欢
    • 2015-06-03
    • 2022-01-23
    • 2014-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-25
    • 2013-05-10
    相关资源
    最近更新 更多