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

我有一个日期采集器,我显示两个月,我想随机选择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
}
130187 次浏览

You can convert the boundary dates to integers (Date.getTime()) and then use Math.random() to generate your random dates within given boundaries. Then go back to Date objects with Date.setTime().

Maybe I am missing something, but isn't this it?

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

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

Using Moment.js && @Demven Weir's answer to get a string value like "03/02/1975".

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

NOTE: Keep adding a zero at a time to increase the span of years produced.

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


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

You will get a random date in US format 4/25/2021

See this Demo on jsfiddle

You can use this snippet to get random date and format;

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

From examples in date-fns

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