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

120

我有一个日期选择器,我显示两个月份,并且我想在每个可见月份中随机选择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
}
7个回答

330

也许我遗漏了什么,但这不就是它吗?

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


1
也许 - 你能在每个月中安排3个不重叠的日期吗? - mplungjan
1
你所说的“重叠”,是指生成相同的日期吗?不,这段代码没有处理这种情况,理论上它可以生成相同的日期(特别是当你截断时间时)。但是消除重复项应该不难。 - Tomasz Nurkiewicz
3
用于获取给定日期之前(或之后)若干天的相关函数:function randomDateAfterDate(start, days) { return new Date(start.getTime() + (Math.random()*days*24*60*60*1000)); } - Autumn Leonard
要测试@AutumnLeonard的示例,以获取给定日期之前的天数,我们可以使用减号-。randomDateAfterDate(new Date(2021, 4, 5), -365) - SAndriy

56

console.log(
  new Date(new Date() - Math.random()*(1e+12))
)


@Typescript 用户:new Date(new Date().valueOf() - Math.random()*(1e+12)) - Page not found
@Typescript 用户:new Date(new Date().valueOf() - Math.random()*(1e+12)) - undefined

10
使用 Moment.js@Demven Weir 的答案,以获取类似于“03/02/1975”的字符串值。
moment(new Date(+(new Date()) - Math.floor(Math.random()*10000000000)))
.format('MM/DD/YYYY');

注意:每次只需增加一个零以增加年份跨度。


这对问题没有任何帮助。你在添加没有人要求的格式。 - Page not found
这并没有为问题增添任何内容。你在添加格式,而没有人要求这样做。 - undefined

2
function generateRandomDate() {
return new Date(+(new Date()) - Math.floor(Math.random() * 10000000000));
}

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

您将会获得一个随机日期,日期格式为美国格式:4/25/2021

jsfiddle上查看演示


这对问题没有任何帮助。你在添加没有人要求的格式。 - Page not found
这对问题没有任何帮助。你在添加没有人要求的格式。 - undefined

1

来自date-fns的示例

const result = eachDayOfInterval({
  start: new Date(2014, 9, 6),
  end: new Date(2014, 9, 10)
})

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

x次不重复(这里x=3)? - mplungjan
只需要添加一个循环和一个已生成日期的数组,以便在生成新日期时进行检查。或者我有什么遗漏吗? - bububaba

0

您可以使用此代码片段来获取随机日期并进行格式化;

const emptyDate = new Date();
const randomDate = new Date();
const dateFormatter = Intl.DateTimeFormat('sv-SE');
const formattedRandomDate = dateFormatter.format(emptyDate.setDate(randomDate.getDate() - Math.floor(Math.random()*1000)));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接