【问题标题】:Generate random date between two dates and times in Javascript在Javascript中生成两个日期和时间之间的随机日期
【发布时间】:2015-10-01 10:21:30
【问题描述】:

我想在 javascript 中生成两个日期之间和两次之间的随机日期。例如,我想在今天和下一个明天之间生成一个随机日期(上午 8 点到下午 6 点之间)。我已经尝试了很多东西,但它们都不起作用,所以我不会粘贴任何代码,因为它不起作用。有没有人做过类似的事情

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

上面发布了我用来生成随机日期的代码

【问题讨论】:

  • 您仍然应该发布不起作用的代码,以便我们可以从某个地方开始。
  • 看起来你只需要generate two random numbers in specific ranges。你试过了吗?
  • 理论上你所拥有的应该可以工作。你能解释一下为什么会出错吗?
  • @FelixKling 你的建议听起来很有趣,但我想要一些通用的东西我可以使用。想象一下,如果我在今天和明年这个时间之间生成一个随机日期,那么使用你的方法并不容易

标签: javascript date


【解决方案1】:

我想我明白你在追求什么。这将返回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;
}

【讨论】:

【解决方案2】:

如果您只想要简单的日期,例如:('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】:

    因为现在每个人都在做 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));
    }
    

    【讨论】:

      【解决方案4】:

      试试这个:

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

      【讨论】:

      • 你的解决方案和我的代码没有区别。我想生成介于特定时间之间的随机日期,而不仅仅是任何时间。
      • @YankiTwizzy 我不明白,他的函数在fromto之间返回随机的Dates,这不是你想要的吗?
      • @YankiTwizzy 我更新了答案,你可以指定创建日期的时间。
      • @user1136881 您的解决方案是在两个日期之间生成随机日期,而不是在两个日期和两次之间生成随机日期(这就是我想要的)
      • @YankiTwizzy 例如,如果您希望日期在上午 8 点到下午 6 点之间,只需在获得随机日期后设置一个随机时间。
      【解决方案5】:

      试试这个:

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

      here 是一个工作小提琴。

      【讨论】:

      • getMonth 是从 0 开始的,所以你需要给它加 1。
      【解决方案6】:

      您可以使用 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(),它允许你传入数字以及Dates。
      • @benams 你的解决方案和我的代码没有区别。我想生成介于特定时间之间的随机日期,而不仅仅是任何时间。
      • 请访问我附加的 jsfiddle 链接。你可以找到 2 个具体的日期。
      【解决方案7】:

      单个函数。

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

      【讨论】:

        【解决方案8】:

        如果您不介意将日期限制在 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'));

        【讨论】:

          猜你喜欢
          • 2010-10-07
          • 1970-01-01
          • 2010-12-30
          • 1970-01-01
          • 2023-03-11
          • 2017-06-03
          • 2013-02-05
          • 1970-01-01
          相关资源
          最近更新 更多