在两个日期内生成随机日期数组的优雅方法

IT技术 javascript date random jquery-ui-datepicker
2021-03-08 14:09:03

我有一个日期选择器,我可以在其中显示两个月,我想在每个可见月份中随机选择 3 个日期

  $('.date').datepicker({
    minDate: new Date(),
    dateFormat: 'DD, MM, d, yy',
    constrainInput: true,
    beforeShowDay: processDates,
    numberOfMonths: 2,
    showButtonPanel: true,
    showOn: "button",
    buttonImage: "images/calendar_icon.jpg",
    buttonImageOnly: true    
  });

这是我的计算

var now = new Date();
var nowTime = parseInt(now.getTime()/1000);
var randomDateSet = {};

function getRandomSet(y,m) {
  var monthIndex = "m"+y+""+m; // m20121 for Jan
  if (randomDateSet[monthIndex]) return randomDateSet[monthIndex];
  // generate here
.
. - I need this part
.
  return randomDateSet[monthIndex];
}

function processDay(date) { // this is calculated for each day so we need a singleton for the array
  var dateTime = parseInt(date.getTime()/1000);
  if (dateTime <= (nowTime-86400)) {
    return [false]; // earlier than today
  }
  var m = date.getMonth(), d = date.getDate(), y = date.getFullYear();
  var randomDates = getRandomSet(y,m);

  for (i = 0; i < randomDates.length; i++) {
    if($.inArray((m+1) + '-' + d + '-' + y,randomDates) != -1 || new Date() > date) {
      return [true,"highlight","Some message"];
    }
  }
  return [true,"normal"]; // ordinary day
}
6个回答

也许我错过了一些东西,但这不是吗?

function randomDate(start, end) {
  return new Date(start.getTime() + Math.random() * (end.getTime() - start.getTime()));
}

const d = randomDate(new Date(2012, 0, 1), new Date());
console.log(d);

测试@AutumnLeonard 示例是否需要在给定日期之前的天数,我们可以使用减号 - randomDateAfterDate(new Date(2021, 4, 5), -365)
2021-04-21 14:09:03
也许 - 你可以在每个月不重叠的 3 个日期中做到这一点吗?
2021-05-04 14:09:03
通过重叠你的意思产生相同的日期?不,这代码并没有处理这种情况下,理论上它可以产生相同的日期(特别是当你截断时间)。但是摆脱重复应该不难。
2021-05-04 14:09:03
获取给定日期之前(或之后)天数的相关函数: function randomDateAfterDate(start, days) { return new Date(start.getTime() + (Math.random()*days*24*60*60*1000)); }
2021-05-20 14:09:03
new Date(+(new Date()) - Math.floor(Math.random()*10000000000))

使用Moment.js && @Demven Weir 的答案来获得像“03/02/1975”这样的字符串值。

moment(new Date(+(new Date()) - Math.floor(Math.random()*10000000000)))
.format('MM/DD/YYYY');

注意:每次添加一个零以增加生产年份的跨度。

您可以将边界日期转换为整数 ( Date.getTime()),然后用于Math.random()在给定边界内生成随机日期。然后返回到Date带有 的对象Date.setTime()

x 次没有重复(这里 x=3)?
2021-04-28 14:09:03
添加一个循环和一组已生成的日期以在生成新日期时进行检查。或者我错过了什么?
2021-05-14 14:09:03
function generateRandomDate() {
return new Date(+(new Date()) - Math.floor(Math.random() * 10000000000));
}

(new generateRandomDate()).toLocaleDateString('en-US')

您将获得美国格式的随机日期 4/25/2021

jsfiddle上看到这个演示