在两个日期内生成随机日期数组的优雅方法
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)
)
【讨论】:
以上是关于在两个日期内生成随机日期数组的优雅方法的主要内容,如果未能解决你的问题,请参考以下文章