首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何生成随机OffsetDateTime范围?

如何生成随机OffsetDateTime范围?
EN

Stack Overflow用户
提问于 2017-09-25 02:02:41
回答 1查看 972关注 0票数 0

我有:

代码语言:javascript
复制
OffsetDateTime earliestStartTime = 20170401T000000Z
OffsetDateTime latestStartTime = 20170531T235959Z

如何生成这样的时间范围:

代码语言:javascript
复制
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。

提前感谢!

EN

回答 1

Stack Overflow用户

发布于 2017-09-25 19:50:52

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

  • 计算最新和最早的启动时间之间的差异。计算0与此差之间的随机值,并将其添加到最早的开始时间,以获得随机启动时间。
  • 根据随机天数创建一个Duration,在这种情况下,这个数字介于0到90之间。

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

下面是一个示例:

代码语言:javascript
复制
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;
     }    
}

输出是

代码语言:javascript
复制
startTime 2017-04-13T08:03:53Z
endTime   2017-06-01T08:03:53Z
duration  49 days

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46396620

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档