【问题标题】:Scala random date between two dates两个日期之间的Scala随机日期
【发布时间】:2017-07-13 21:14:54
【问题描述】:

我正在尝试编写一个方法,该方法将两个java.util.Date 作为参数并在Scala 中返回这两者之间的随机java.util.Date。但是,我每次都得到相同的虚拟结果。我的代码有什么问题?

注意:

randomDateBetween(new Date(2017, 1, 1), new Date(2018, 1, 1)) 总是返回Tue Jun 12 09:36:00 EET 3917

代码:

 def randomDateBetween( firstDate : Date, secondDate : Date) : Date =
  {
    val ratio = new Random().nextInt(100);

    val difference = (secondDate.getTime - firstDate.getTime)

    val surplusMillis = (difference * (ratio / 100.0)).asInstanceOf[Long]
    
    val cal = Calendar.getInstance()

    cal.setTimeInMillis(surplusMillis + firstDate.getTime)

    return cal.getTime()
  } 

我修好了,还是谢谢你们。错误的原因是 java.util.Date 被弃用。我像这样更改了我的方法调用,它工作得非常好:

val date1 = Calendar.getInstance
val date2 = Calendar.getInstance

date1.set(2017, 1, 1)
date2.set(2018, 1, 1)

randomDateBetween(date1.getTime, date2.getTime)

【问题讨论】:

  • 不是弃用,而是你没看文档:“year the year-1900”

标签: java scala date


【解决方案1】:

您需要像这样播种 Random 对象:

Random.setSeed(System.currentTimeMillis())
val ratio = new Random().nextInt(100)

【讨论】:

    【解决方案2】:

    (这里是 Java 语法,而不是 Scala)

    ThreadLocalRandom

    Answer by sheunis 正确但已过时。

    另一个过时的选项是Math.random

    randomNum = minimum + ( int )( Math.random() * maximum ); 
    

    自 Java 7 以来的现代方法是 ThreadLocalRandom。看到这个Answer

    long random = ThreadLocalRandom.current().nextLong( minimum , maximum + 1 );
    

    Random 的这两种替代方法都使用内部生成的种子进行初始化,否则可能无法修改。

    避免使用旧的日期时间类。

    此外,您正在使用麻烦的旧日期时间类 DateCalendar,它们现在是遗留的,被 java.time 类所取代。

    使用 java.time

    对于没有时间和时区的仅日期值,请使用LocalDate 类。

    LocalDate start = LocalDate.of( 2017 , Month.JANUARY , 1 ) ;
    LocalDate stop = LocalDate.of( 2018 , Month.JANUARY , 1 ) ;
    

    计算之间的天数,以确定随机天数。

    long maxDays = ChronoUnit.DAYS.between( start , stop ) ;
    

    所以我们想添加一个随机天数,少至零,多至maxDays

    long days = ThreadLocalRandom.current().nextLong( 0 , maxDays + 1 );
    
    LocalDate ld = start.plusDays( days ) ;
    

    【讨论】:

      【解决方案3】:
       Date randomDate= new Date(ThreadLocalRandom.current().nextLong(fromDate.getTime(), toDate.getTime()+1));
      

      我对 scala 了解不多。我已经在 java 中对其进行了测试,我认为这个解决方案也适用于 scala。如有需要请修改代码。

      【讨论】:

        猜你喜欢
        • 2017-06-03
        • 2016-05-16
        • 1970-01-01
        • 2010-10-07
        • 2015-10-01
        • 2023-03-11
        • 2014-01-13
        • 1970-01-01
        相关资源
        最近更新 更多