Java Top.

使用Spring 5和Spring Boot 2开始,通过学习春天课程:

>>查看课程

1.概述

在本教程中,我们将看到如何以界限和无界时尚生成随机日期和时间。

我们将研究如何使用遗留文件生成这些值java.util.date.API和新的日期-时间图书馆来自Java 8。

2.随机日期和时间

日期和时间不过是32位的整数纪元时间,因此我们可以通过以下此简单算法生成随机时间值:

  1. 生成一个随机的32位数字,anint
  2. 将生成的随机值传递给适当的日期和时间构造函数或构建器

2.1。有限的立即的

java.time.i.第一个是Java 8中的新日期和时间添加之一。它们代表时间线的瞬时点。

为了生成一个随机的立即的两个其他之间,我们可以:

  1. 在给定的时期之间生成随机数瞬间
  2. 创造随机立即的通过将该随机数传递给Ofepochsecond()方法
public static Instant between(Instant startInclusive, Instant endExclusive) {long startSeconds = startinclude . getepochsecond ();long endSeconds = endExclusive.getEpochSecond();long random = ThreadLocalRandom .current() .nextLong(startSeconds, endSeconds);返回Instant.ofEpochSecond(随机);}

为了在多线程环境中实现更多的吞吐量,我们使用ThreadLocalRandom生成我们的随机数。

我们可以验证生成的立即的总是大于或等于第一个瞬间和小于第二个立即的:

即时百年次= Instant.Now()。减号(持续时间。(100 * 365));Instant Tendaysago = Instant.Now()。减号(持续时间。(10));即时随机= randomDatetimes.betweeen(百家士索,卷大岛);Assertthat(随机)。四(百家大),斯托斯塔戈);

当然,请记住,测试随机性本质上是不确定性的,通常不建议在实际应用程序中进行测试。

类似地,也可以生成一个随机变量立即的在另一个之后或之前:

公共静态即时(即时startinclusive){返回(startinclusive,Instant.max);}之前的公共静态瞬间(即时upperexclusive){返回(Instant.min,Upperexusive);}

2.2。有限的日期

其中一个java.util.date.构造函数使用epoch之后的毫秒数。所以,我们可以用同样的算法来生成一个随机日期在另外两个之间:

(日期startinclusive,dateexclusive)之间的公共静态日期{long startmillis = startinclusive.gettime();long endmillis = EndExclusive.gettime();long randommillissinceepoch = threadlocalrandom .current().nextlong(startmillis,endmillis);返回新日期(randommillissinceoch);}

同样,我们应该能够验证这种行为:

long day = TimeUnit.DAYS.toMillis(1);long now = new Date().getTime();Date hundredYearsAgo = new Date(now - day * 365 * 100);Date tenDaysAgo = new Date(now - day * 10);日期随机= LegacyRandomDateTimes。之间(hundredYearsAgo tenDaysAgo);Assertthat(随机)。四(百家大),斯托斯塔戈);

2.3。无界限立即的

为了产生一个完全随机的立即的,我们可以简单地生成随机整数并将其传递给Ofepochsecond()方法:

public static Instant timestamp() {return Instant. ofepochsecond (ThreadLocalRandom.current().nextInt());}

使用32位秒,因为大纪元时间产生更合理的随机时间,因此我们使用nextInt ()这里的方法

此外,该值仍然可能在最小和最大值之间立即的Java可以处理的值:

Instant random = RandomDateTimes.timestamp();为了(随机).isBetween(即时。分钟,Instant.MAX);

2.4。无界限日期

类似于界限示例,我们可以将随机值传递给日期的构造函数随机生成日期:

公共静态日期时间戳(){返回新日期(ThreadLocalrandom.current()。nextint()* 1000L);}

自从此以来构造函数的时间单位是毫秒的,我们通过将32位时秒转换为1000乘以1000。

当然,这个值仍然在可能的最大值和最小值之间日期价值观:

日期min_date =新日期(long.min_value);日期max_date =新日期(long.max_value);日期随机= legacyrandomdatetimes.timestamp();assertthat(随机)。sistween(min_date,max_date);

3.随机的日期

到目前为止,我们生成了包含Date和Time组件的随机时间。相似地,我们可以使用emoch天的概念,只需日期组件即可生成随机时间。

单时期的日子等于自1970年1月1日以来的天数。因此,为了产生随机日期,我们只需生成随机数并使用该号码作为单行日。

3.1。有限的

我们需要一个仅包含日期组件的时间抽象,因此java.time.LocalDate看起来是个不错的候选人:

public static LocalDate between(LocalDate startInclusive, LocalDate endExclusive) {long startpochday = startInclusive. toepochday ();long endpochday = endexexclusive . toepochday ();long randomDay = ThreadLocalRandom .current() .nextLong(startEpochDay, endpochday);返回LocalDate.ofEpochDay (randomDay);}

在这里我们正在使用Toebochday()转换每个方法的方法localDate.到了相应的时期。同样,我们可以验证这种方法是否正确:

LocalDate start = LocalDate。(1989年,月。10月14日);LocalDate end = LocalDate.now();LocalDate random =随机日期。之间(开始、结束);为了(随机)。isBetween(开始、结束);

3.2。无界限

为了生成任意范围的随机日期,我们可以简单地生成一个随机的纪元日:

public static LocalDate date() {int hundredYears = 100 * 365;LocalDate返回。ofEpochDay (ThreadLocalRandom .current()。nextInt (-hundredYears hundredYears));}

我们的随机日期发生器在时期之前和之后的100年内选择随机日。同样,这背后的理由是产生合理的日期值:

LocalDate randomDay = RandomDates.date();为了(randomDay) .isBetween (LocalDate。分钟,LocalDate.MAX);

4.随机时间

类似于我们的日期所做的,我们可以使用时间组件生成随机的时间。为了做到这一点,我们可以使用第二天的第二个概念。那是,一个随机的时间等于一个随机数,代表从一天开始的秒数。

4.1。有限的

java.time.LocalTime类是一个时间抽象,除了时间组件

public static localtime(lumpytime starttime,localtime eMptime){int startseconds = starttime.tosecondofday();int snaldeconds = endtime.tosecondofday();INTUNCETIME = ThreadLocalRandom .current().nextint(startseconds,suptereconds);返回localtime.ofsecondofday(随机时间);}

为了在另外两个之间生成随机时间,我们可以:

  1. 在给定时间的第二天的第二天之间产生随机数
  2. 使用这个随机数创建一个随机时间

我们可以轻松验证此随机时间生成算法的行为:

LocalTime早晨=本地时间。30(8日);LocalTime randomTime = RandomTimes.between(本地时间。午夜,早上);为了(randomTime) .isBetween(本地时间。午夜,早上).isBetween(本地时间。分钟,LocalTime.MAX);

4.2。无界限

即使是无界时间值也应该在00:00:00至23:59:59范围内,所以我们可以通过委派来简单地实现这个逻辑:

公共静态lumpytime时间(){返回(localtime.min,localtime.max);}

结论

在本教程中,我们将随机日期和时间的定义简化为随机数。然后,我们看到这种简化如何帮助我们生成随机的时间值,其行为类似于时间戳、日期或时间。

像往常一样,示例代码可在上面提供GitHub

Java底部

使用Spring 5和Spring Boot 2开始,通过学习春天课程:

>>查看课程
本文评论关闭!