2017-09-25 71 views
0

我:如何生成随机OffsetDateTime范围是多少?

OffsetDateTime earliestStartTime = 20170401T000000Z 
OffsetDateTime latestStartTime = 20170531T235959Z 

我怎么能生成一个时间范围,使得:

startTime is a random OffsetDateTime in [earliestStartTime .. latestStartTime]; 
Duration is a random int in [1 .. 90], representing number of Days. 
endTime is startTime + Duration. 

我没有 “com.pholser.junit.quickcheck.random.SourceOfRandomness”,所以SourceOfRandomness不能使用。

在此先感谢!

+0

是持续时间较毫秒一个int?秒?分钟?什么? – Catchwa

+0

持续时间代表一天。谢谢。 – leo

回答

0

您可以分两步解决这个问题:

  • 计算最新的最早开始时间之间的区别。计算0这种差异之间的随机值,并将它添加到的最早开始时间,以获得一个随机的开始时间
  • 从一个随机数天,在这个数字是0和90之间,你的情况创建Duration

(当然,添加此持续时间加到开始时间将产生结束时刻)

下面是一个例子:

import java.time.Duration; 
import java.time.OffsetDateTime; 
import java.time.temporal.ChronoUnit; 
import java.util.Random; 

public class RandomOffsetDateTimeRange 
{ 
    public static void main(String[] args) 
    { 
     OffsetDateTime earliestStartTime = 
      OffsetDateTime.parse("2017-04-01T00:00:00+00:00"); 
     OffsetDateTime latestStartTime = 
      OffsetDateTime.parse("2017-05-31T23:59:59+00:00"); 
     int maxDays = 90; 

     Random random = new Random(0); 
     OffsetDateTime startTime = 
      computeRandomOffsetDateTime(
       earliestStartTime, latestStartTime, random); 
     Duration duration = randomDaysDuration(maxDays, random); 
     OffsetDateTime endTime = startTime.plus(duration); 

     System.out.println("startTime " + startTime); 
     System.out.println("endTime " + endTime);   
     System.out.println("duration " + duration.toDays() + " days");   
    } 

    private static Duration randomDaysDuration(int maxDays, Random random) 
    { 
     int days = random.nextInt(maxDays); 
     return Duration.ofDays(days); 
    } 

    private static OffsetDateTime computeRandomOffsetDateTime(
     OffsetDateTime min, OffsetDateTime max, Random random) 
    { 
     long differenceInSeconds = min.until(max, ChronoUnit.SECONDS); 
     long seconds = nextLong(random, differenceInSeconds); 
     return min.plusSeconds(seconds); 
    } 

    // From https://stackoverflow.com/a/2546186/3182664 
    private static long nextLong(Random rng, long n) { 
     // error checking and 2^x checking removed for simplicity. 
     long bits, val; 
     do { 
      bits = (rng.nextLong() << 1) >>> 1; 
      val = bits % n; 
     } while (bits-val+(n-1) < 0L); 
     return val; 
    }  
} 

输出是

startTime 2017-04-13T08:03:53Z 
endTime 2017-06-01T08:03:53Z 
duration 49 days 

(注:在该实例中,我计算以秒为单位的差异。根据应用程序的情况下,您可能需要使用不同的单元,例如,整个天)