首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >产生随机出生日期

产生随机出生日期
EN

Stack Overflow用户
提问于 2010-10-21 08:00:46
回答 15查看 114K关注 0票数 70

我正试图使用Java程序为我的数据库中的人生成一个随机的出生日期。我该怎么做?

EN

回答 15

Stack Overflow用户

回答已采纳

发布于 2010-10-21 08:41:07

代码语言:javascript
复制
import java.util.GregorianCalendar;

public class RandomDateOfBirth {

    public static void main(String[] args) {

        GregorianCalendar gc = new GregorianCalendar();

        int year = randBetween(1900, 2010);

        gc.set(gc.YEAR, year);

        int dayOfYear = randBetween(1, gc.getActualMaximum(gc.DAY_OF_YEAR));

        gc.set(gc.DAY_OF_YEAR, dayOfYear);

        System.out.println(gc.get(gc.YEAR) + "-" + (gc.get(gc.MONTH) + 1) + "-" + gc.get(gc.DAY_OF_MONTH));

    }

    public static int randBetween(int start, int end) {
        return start + (int)Math.round(Math.random() * (end - start));
    }
}
票数 87
EN

Stack Overflow用户

发布于 2010-10-21 08:14:22

java.util.Date有一个接受毫秒的构造函数,而java.util.Random有一个一种方法,它可以给你随机的毫秒数。您可能希望根据所需DOB的范围为随机值设置一个范围,但这些值应该会这样做。

Very粗略地说:

代码语言:javascript
复制
Random  rnd;
Date    dt;
long    ms;

// Get a new random instance, seeded from the clock
rnd = new Random();

// Get an Epoch value roughly between 1940 and 2010
// -946771200000L = January 1, 1940
// Add up to 70 years to it (using modulus on the next long)
ms = -946771200000L + (Math.abs(rnd.nextLong()) % (70L * 365 * 24 * 60 * 60 * 1000));

// Construct a date
dt = new Date(ms);
票数 42
EN

Stack Overflow用户

发布于 2015-07-02 19:17:40

基于Java 8的解决方案的代码片段:

代码语言:javascript
复制
Random random = new Random();
int minDay = (int) LocalDate.of(1900, 1, 1).toEpochDay();
int maxDay = (int) LocalDate.of(2015, 1, 1).toEpochDay();
long randomDay = minDay + random.nextInt(maxDay - minDay);

LocalDate randomBirthDate = LocalDate.ofEpochDay(randomDay);

System.out.println(randomBirthDate);

Note:这会产生一个随机日期,介于1900年1月1日(含)到2015年1月1日(排他性)之间。

Note:它基于时代日数,即相对于1970年1月1日(历代)的天数--在时代之后的正意义,在时代之前的否定意义。

您还可以创建一个小型实用程序类:

代码语言:javascript
复制
public class RandomDate {
    private final LocalDate minDate;
    private final LocalDate maxDate;
    private final Random random;

    public RandomDate(LocalDate minDate, LocalDate maxDate) {
        this.minDate = minDate;
        this.maxDate = maxDate;
        this.random = new Random();
    }

    public LocalDate nextDate() {
        int minDay = (int) minDate.toEpochDay();
        int maxDay = (int) maxDate.toEpochDay();
        long randomDay = minDay + random.nextInt(maxDay - minDay);
        return LocalDate.ofEpochDay(randomDay);
    }

    @Override
    public String toString() {
        return "RandomDate{" +
                "maxDate=" + maxDate +
                ", minDate=" + minDate +
                '}';
    }
}

像这样使用它:

代码语言:javascript
复制
RandomDate rd = new RandomDate(LocalDate.of(1900, 1, 1), LocalDate.of(2010, 1, 1));
System.out.println(rd.nextDate());
System.out.println(rd.nextDate()); // birthdays ad infinitum
票数 41
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3985392

复制
相关文章

相似问题

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