在Javascript中生成两个日期和时间之间的随机日期。

40

我想在javascript中生成两个日期和两个时间之间的随机日期。例如,我想在今天和明天之间(上午8点至下午6点之间)生成一个随机日期。我尝试了很多方法,但都不起作用,所以我不会粘贴任何代码。有人做过类似的事情吗?

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

我用于生成随机日期的代码已发布如上所示。


1
你应该仍然发布那些无法运行的代码,这样我们才能有一个起点。 - doldt
1
看起来你只需要在特定范围内生成两个随机数。你已经尝试过了吗? - Felix Kling
2
尝试一下这个:https://dev59.com/zmox5IYBdhLWcg3wr2To - Oliver Gray
@FelixKling,你的建议听起来很有趣,但我想要一些通用的东西。想象一下,如果我要生成一个在今天和明年这个时间之间的随机日期,使用你的方法并不容易。 - Yanki Twizzy
你使用哪个浏览器? - benams
显示剩余5条评论
8个回答

48

我觉得我理解你的意思了。这将返回一个随机日期,其日期在startend之间,以及一个随机小时数,在startHourendHour范围内(应为0-23之间的值)。

function randomDate(start, end, startHour, endHour) {
  var date = new Date(+start + Math.random() * (end - start));
  var hour = startHour + Math.random() * (endHour - startHour) | 0;
  date.setHours(hour);
  return date;
}

3
开始和结束时间应该是什么?我尝试传入随机整数,但它总是返回“1969年12月31日星期三”,但每次更改开始和结束时间时都会返回不同的时间。 - dmikester1
JavaScript中的日期类型 - https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Date - Piper0804
2
randomDate(new Date(2020, 0, 1), new Date(), 0, 24) - Ryan Allen
抱歉回复晚了,但我最近创建了这个库 @fars20/random-sources https://www.npmjs.com/package/@fars20/random-sources 来实现这个功能。 - Sagar

12

自从现在每个人都在使用TypeScript,这是一个更现代的示例,其中包含如何使用它的示例。

const generateRandomDOB = (): string => {
    const random = getRandomDate(new Date('1950-02-12T01:57:45.271Z'), new Date('2001-02-12T01:57:45.271Z'))
    return random.toISOString();
}

function getRandomDate(from: Date, to: Date) {
    const fromTime = from.getTime();
    const toTime = to.getTime();
    return new Date(fromTime + Math.random() * (toTime - fromTime));
}

11

如果你只需要像这样的简单日期:('12/13/2013','01/26/2011'),这是一个很好的选择。

function randomDate(date1, date2){
    function randomValueBetween(min, max) {
      return Math.random() * (max - min) + min;
    }
    var date1 = date1 || '01-01-1970'
    var date2 = date2 || new Date().toLocaleDateString()
    date1 = new Date(date1).getTime()
    date2 = new Date(date2).getTime()
    if( date1>date2){
        return new Date(randomValueBetween(date2,date1)).toLocaleDateString()   
    } else{
        return new Date(randomValueBetween(date1, date2)).toLocaleDateString()  

    }
}

randomDate('02/13/2013', '01/01/2000')
"1/31/2009"
randomDate()
"6/14/2001"

3

试试这个:

function getRandomDate(from, to) {
    from = from.getTime();
    to = to.getTime();
    return new Date(from + Math.random() * (to - from));
}

在创建日期时,您也可以设置时间:

var d = new Date(year, month, day, hours, minutes, seconds, milliseconds);

如果您想让日期在上午8点至下午6点之间,只需在获取随机日期后设置一个随机时间即可。因此,在这种情况下,函数应该是这样的:
function getRandomDate(fromDate, toDate, fromTime, toTime) {
    fromDate = fromDate.getTime();
    toDate = toDate.getTime();
    fromTime.setFullYear(1970,0,1); //reset the date
    toTime.setFullYear(1970,0,1); //because we only want a time here
    fromTime = fromTime.getTime();
    toTime = toTime.getTime();
    randomDate = new Date(fromDate + Math.random() * (toDate - fromDate));
    randomTime = new Date(fromTime + Math.random() * (toTime - fromTime));
    randomDate.setHours(randomTime.getHours());
    randomDate.setMinutes(randomTime.getMinutes());
    randomDate.setSeconds(randomTime.getSeconds());
}

你的解决方案和我的代码没有区别。我想生成落在特定时间段内的随机日期,而不仅仅是任意时间。 - Yanki Twizzy
@YankiTwizzy,我不明白,他的函数返回从“from”到“to”之间的随机日期,这不是你想要的吗? - Peter Olson
@YankiTwizzy 我更新了答案,你可以在创建日期时指定时间。 - user1136881
@user1136881 您的解决方案生成的是两个日期之间的随机日期,而不是我想要的在两个日期和两个时间之间生成随机日期。 - Yanki Twizzy
如果你想让日期在上午8点到下午6点之间,只需在获取随机日期后设置一个随机时间即可。 - user1136881

3

试一下这个:

var yourRandomGenerator=function(rangeOfDays,startHour,hourRange){
    var today = new Date(Date.now());
    return new Date(today.getYear()+1900,today.getMonth(), today.getDate()+Math.random() *rangeOfDays, Math.random()*hourRange + startHour, Math.random()*60)
}

console.log(yourRandomGenerator(2,8,2));

这里是一个可运行的 JSFiddle 程序,请点击这里

1
getMonth 是基于0的,所以你需要加1。 - Stephen Saucier

1

你可以使用JS的能力将日期转换为整数时间戳。

这是一个简单可行的JSfiddle:

function randomTime(start, end) {
    var diff =  end.getTime() - start.getTime();
    var new_diff = diff * Math.random();
    var date = new Date(start.getTime() + new_diff);
    return date;
}

你也可以使用 +end+start 代替 end.getTime()start.getTime(),这允许您传递数字以及日期。 - Peter Olson
@benams,你的解决方案和我的代码没有区别。我想要生成落在某个时间段内的随机日期,而不仅仅是任意时间。 - Yanki Twizzy
请访问我附加的jsfiddle链接。您可以在那里找到2个特定日期。 - benams

1
如果您可以接受仅限于1970-01-01 00:00:00之后的日期,那么这可能适合您:

function getRamdomDateInBetween(start, end) {
    start = Date.parse(start);
    end = Date.parse(end);

    return new Date(Math.floor(Math.random() * (end - start + 1) + start));
}

console.log(getRamdomDateInBetween('2021-01-01', '2021-01-30'));


1
一个单一的函数。
    function (line) {
   return  new Date(new Date('2019-02-12T01:57:45.271Z').getTime() + Math.random() * (new Date('2020-02-12T01:57:45.271Z').getTime() - new Date('2019-02-12T01:57:45.271Z').getTime())).toISOString(); 
} 

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