web-dev-qa-db-fra.com

Générer une date de naissance aléatoire

J'essaie de générer une date de naissance aléatoire pour les personnes de ma base de données à l'aide d'un programme Java. Comment dois-je procéder?

58
user475529
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));
    }
}
74
Saul

Java.util.Date a un constructeur qui accepte les millisecondes depuis The Epoch, et Java.util.Random a ne méthode qui peut vous donner un nombre aléatoire de millisecondes. Vous voudrez définir une plage pour la valeur aléatoire en fonction de la plage de DOB que vous souhaitez, mais ceux-ci devraient le faire.

Très grosso modo:

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);
37
T.J. Crowder

Extrait pour une solution basée sur Java 8:

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);

Remarque : Cela génère une date aléatoire entre le 1er janvier 1900 (inclus) et le 1er janvier 2015 (exclusif).

Remarque : Elle est basée sur jours d'époque , c'est-à-dire les jours par rapport au 1er janvier 1970 ( époque ) - sens positif après l'époque, sens négatif avant l'époque


Vous pouvez également créer une petite classe utilitaire:

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 +
                '}';
    }
}

et utilisez-le comme ceci:

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
34
Jens Hoffmann

Vous devez définir une date aléatoire, non?

Une façon simple de le faire est de générer un nouvel objet Date, en utilisant un long ( temps en millisecondes depuis le 1er janvier 197 ) et de soustraire un long:

new Date(Math.abs(System.currentTimeMillis() - RandomUtils.nextLong()));

( RandomUtils est tiré d'Apache Commons Lang).

Bien sûr, cela est loin d'être une vraie date aléatoire (par exemple, vous n'obtiendrez pas de date avant 1970), mais je pense que ce sera suffisant pour vos besoins.

Sinon, vous pouvez créer votre propre date en utilisant Calendar class:

int year = // generate a year between 1900 and 2010;
int dayOfYear = // generate a number between 1 and 365 (or 366 if you need to handle leap year);
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR, randomYear);
calendar.set(Calendar.DAY_OF_YEAR, dayOfYear);
Date randomDoB = calendar.getTime();
20
Romain Linsolas

Pour Java 8 -> En supposant que les données de naissance doivent être antérieures au jour actuel:

import Java.time.LocalDate;
import Java.time.LocalTime;
import Java.time.Period;
import Java.time.temporal.ChronoUnit;
import Java.util.Random;

public class RandomDate {

    public static LocalDate randomBirthday() {
        return LocalDate.now().minus(Period.ofDays((new Random().nextInt(365 * 70))));
    }

    public static void main(String[] args) {
        System.out.println("randomDate: " + randomBirthday());
    }
}
6
Witold Kaczurba

Si cela ne vous dérange pas d'ajouter une nouvelle bibliothèque à votre code, vous pouvez utiliser MockNeat (avertissement: je suis l'un des auteurs).

MockNeat mock = MockNeat.threadLocal();

// Generates a random date between [1970-1-1, NOW)
LocalDate localDate = mock.localDates().val();
System.out.println(localDate);

// Generates a random date in the past
// but beore 1987-1-30
LocalDate min = LocalDate.of(1987, 1, 30);
LocalDate past = mock.localDates().past(min).val();
System.out.println(past);

LocalDate max = LocalDate.of(2020, 1, 1);
LocalDate future = mock.localDates().future(max).val();
System.out.println(future);

// Generates a random date between 1989-1-1 and 1993-1-1
LocalDate start = LocalDate.of(1989, 1, 1);
LocalDate stop = LocalDate.of(1993, 1, 1);
LocalDate between = mock.localDates().between(start, stop).val();
System.out.println(between);
3
Andrei Ciobanu

Vous pouvez commander randomizer pour la génération de données aléatoires.Cette bibliothèque permet de créer des données aléatoires à partir d'une classe de modèle donnée.Vérifiez ci-dessous l'exemple de code.

public class Person {

    @DateValue( from = "01 Jan 1990",to = "31 Dec 2002" , customFormat = "dd MMM yyyy")
    String dateOfBirth;

}

//Generate random 100 Person(Model Class) object 
Generator<Person> generator = new Generator<>(Person.class);  
List<Person> persons = generator.generate(100);                          

Comme il existe de nombreux générateurs de données intégrés accessibles à l'aide d'annotations, vous pouvez également créer un générateur de données personnalisé.Je vous suggère de parcourir la documentation fournie sur la page de la bibliothèque.

2
Ronak Poriya

Génération d'une date de naissance aléatoire:

import Java.util.Calendar;

public class Main {
  public static void main(String[] args) {
    for (int i = 0; i < 100; i++) {
        System.out.println(randomDOB());
    }
  }

  public static String randomDOB() {

    int yyyy = random(1900, 2013);
    int mm = random(1, 12);
    int dd = 0; // will set it later depending on year and month

    switch(mm) {
      case 2:
        if (isLeapYear(yyyy)) {
          dd = random(1, 29);
        } else {
          dd = random(1, 28);
        }
        break;

      case 1:
      case 3:
      case 5:
      case 7:
      case 8:
      case 10:
      case 12:
        dd = random(1, 31);
        break;

      default:
        dd = random(1, 30);
      break;
    }

    String year = Integer.toString(yyyy);
    String month = Integer.toString(mm);
    String day = Integer.toString(dd);

    if (mm < 10) {
        month = "0" + mm;
    }

    if (dd < 10) {
        day = "0" + dd;
    }

    return day + '/' + month + '/' + year;
  }

  public static int random(int lowerBound, int upperBound) {
    return (lowerBound + (int) Math.round(Math.random()
            * (upperBound - lowerBound)));
  }

  public static boolean isLeapYear(int year) {
    Calendar calendar = Calendar.getInstance();
    calendar.set(Calendar.YEAR, year);
    int noOfDays = calendar.getActualMaximum(Calendar.DAY_OF_YEAR);

    if (noOfDays > 365) {
        return true;
    }

    return false;
  }
}
2
BALAJI POTHULA

Regardez cette méthode:

public static Date dateRandom(int initialYear, int lastYear) {
    if (initialYear > lastYear) {
        int year = lastYear;
        lastYear = initialYear;
        initialYear = year;
    }

    Calendar cInitialYear = Calendar.getInstance();
    cInitialYear.set(Calendar.YEAR, 2015);
    long offset = cInitialYear.getTimeInMillis();

    Calendar cLastYear = Calendar.getInstance();
    cLastYear.set(Calendar.YEAR, 2016);
    long end = cLastYear.getTimeInMillis();

    long diff = end - offset + 1;
    Timestamp timestamp = new Timestamp(offset + (long) (Math.random() * diff));
    return new Date(timestamp.getTime());
}
2
Alberto Cerqueira

Je pense que cela fera l'affaire:

public static void main(String[] args) {
    Date now = new Date();
    long sixMonthsAgo = (now.getTime() - 15552000000l);
    long today = now.getTime();

    for(int i=0; i<10; i++) {
        long ms = ThreadLocalRandom.current().nextLong(sixMonthsAgo, today);

        Date date = new Date(ms);

        System.out.println(date.toString());
    }

}
1
Spiff

Si cela ne vous dérange pas une bibliothèque tierce, la bibliothèque tils a un RandomDateUtils qui génère des Java.util.Dates aléatoires et toutes les dates, heures, instants et durées de Java 8's API date et heure

LocalDate birthDate = RandomDateUtils.randomPastLocalDate();
LocalDate today = LocalDate.now();
LocalDate under18YearsOld = RandomDateUtils.randomLocalDate(today.minus(18, YEARS), today);
LocalDate over18YearsOld = RandomDateUtils.randomLocalDateBefore(today.minus(18, YEARS));

Il se trouve dans le référentiel central Maven à:

<dependency>
  <groupId>com.github.rkumsher</groupId>
  <artifactId>utils</artifactId>
  <version>1.3</version>
</dependency>
1
RKumsher

J'étudie Scala et j'ai fini par googler Java solutions pour choisir une date aléatoire entre les plages. J'ai trouvé ce post super utile et c'est ma solution finale. J'espère que cela peut aider les futurs Scala et Java programmeurs.

import Java.sql.Timestamp

def date_Rand(ts_start_str:String = "2012-01-01 00:00:00", ts_end_str:String = "2015-01-01 00:00:00"): String = {
    val ts_start = Timestamp.valueOf(ts_start_str).getTime()
    val ts_end = Timestamp.valueOf(ts_end_str).getTime()
    val diff = ts_end - ts_start
    println(diff)
    val ts_Rand = new Timestamp(ts_start + (Random.nextFloat() * diff).toLong)
    return ts_Rand.toString
}                                         //> date_Rand: (ts_start_str: String, ts_end_str: String)String

println(date_Rand())                      //> 94694400000
                                              //| 2012-10-28 18:21:13.216

println(date_Rand("2001-01-01 00:00:00", "2001-01-01 00:00:00"))
                                              //> 0
                                              //| 2001-01-01 00:00:00.0
println(date_Rand("2001-01-01 00:00:00", "2010-01-01 00:00:00"))
                                              //> 283996800000
                                              //| 2008-02-16 23:15:48.864                    //> 2013-12-21 08:32:16.384
0
B.Mr.W.