Scala是两个日期之间的随机日期

时间:2017-07-13 21:14:54

标签: java scala date

我正在尝试编写一个方法,该方法将两个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)

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

(这里是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 ) ;

答案 2 :(得分:0)

 Date randomDate= new Date(ThreadLocalRandom.current().nextLong(fromDate.getTime(), toDate.getTime()+1));

我对scala不太了解。我在java中测试过,我认为这个解决方案也适用于scala。如果需要,请修改代码。