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

Posted

技术标签:

【中文标题】在两个日期内生成随机日期数组的优雅方法【英文标题】:Elegant method to generate array of random dates within two dates 【发布时间】:2012-02-20 13:55:06 【问题描述】:

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

【问题讨论】:

【参考方案1】:

也许我错过了什么,但这不是吗?

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

【讨论】:

也许 - 你可以在每个月不重叠的 3 个日期这样做吗? overlaps 你的意思是生成相同的日期吗?不,这段代码处理这种情况,理论上它可以生成相同的日期(尤其是当你截断时间时)。但删除重复项应该不难。 获取日期前(或后)天数的相关函数:function randomDateAfterDate(start, days) return new Date(start.getTime() + (Math.random()*days*24*60*60*1000)); 测试@AutumnLeonard 示例,如果我们需要给定日期之前的天数,我们可以使用减号 - randomDateAfterDate(new Date(2021, 4, 5), -365)跨度> 【参考方案2】:
new Date(+(new Date()) - Math.floor(Math.random()*10000000000))

【讨论】:

【参考方案3】:

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

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

注意:不断添加零以增加生产年份的跨度。

【讨论】:

【参考方案4】:

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

【讨论】:

x 次不重复(这里 x=3)? 添加一个循环和一组已生成日期以在生成新日期时进行检查的问题。还是我错过了什么?【参考方案5】:
function generateRandomDate() 
return new Date(+(new Date()) - Math.floor(Math.random() * 10000000000));


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

你会得到一个美国格式的随机日期4/25/2021

在jsfiddle上查看此演示

【讨论】:

【参考方案6】:

你可以使用这个sn-p来获取随机日期和格式;

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

【讨论】:

【参考方案7】:

来自date-fns中的示例

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

【讨论】:

以上是关于在两个日期内生成随机日期数组的优雅方法的主要内容,如果未能解决你的问题,请参考以下文章

C# 获取一个指定范围内的随机日期函数代码

PHP——生成随机数和日期时间

js如何在一个时间段内生成随机的的时间日期?求指教?

shell脚本生成[4,9]范围内的随机整数,包含边界值4和9,并将随机数序列存放在一个数组中,脚本实现?

如何使用php在两个日期之间生成随机日期?

在熊猫中生成给定范围内的随机日期