web-dev-qa-db-fra.com

comment générer un horodatage aléatoire en Java?

Je veux générer un horodatage aléatoire et y ajouter un incrément aléatoire pour générer un deuxième horodatage. est-ce possible?

Si je passe des valeurs longues aléatoires pour créer un horodatage et que je souhaite générer de manière aléatoire cette valeur longue, quelles seraient les contraintes pour générer cette valeur afin de donner un horodatage en 2012 par exemple? 

15
Sami

Vous devez redimensionner le nombre aléatoire afin qu'il se situe dans la plage d'une année donnée, puis ajouter le début de l'année comme décalage. Le nombre de millisecondes d'une année change d'une année à l'autre (les années bissextiles ont un jour supplémentaire, certaines années ont des minutes bissextiles, etc.). Vous pouvez donc déterminer la plage avant la mise à l'échelle de la manière suivante:

long offset = Timestamp.valueOf("2012-01-01 00:00:00").getTime();
long end = Timestamp.valueOf("2013-01-01 00:00:00").getTime();
long diff = end - offset + 1;
Timestamp Rand = new Timestamp(offset + (long)(Math.random() * diff));
43
dasblinkenlight

Pour votre exemple, la valeur longue à entrer dans Date doit être comprise entre 1325397600 et 1293861599 pour l'année 2012. Essayez d'utiliser ce site pour vérifier! Pour générer une date aléatoire, vous pouvez faire quelque chose comme ceci:

Random r =new Random();
long unixtime=(long) (1293861599+r.nextDouble()*60*60*24*365);
Date d = new Date(unixtime);
6
Aleksandr Kravets

Utilisez ApacheCommonUtils pour générer une longueur aléatoire dans une plage donnée, puis créez une Date à partir de cette durée.

Exemple:

import org.Apache.commons.math.random.RandomData;
import org.Apache.commons.math.random.RandomDataImpl;

public Date nextDate(Date min, Date max) {

      RandomData randomData = new RandomDataImpl();
      return new Date(randomData.nextLong(min.getTime(), max.getTime()));
}
2
uris

Vous pouvez générer un horodatage aléatoire en générant une long aléatoire dans la plage appropriée, puis en la traitant comme un horodatage de précision milliseconde; par exemple. new Date(long).

Pour déterminer la plage, créez un objet Date ou Calendrier (ou similaire) qui représente la date de début et la date de fin de la plage, puis appelez le long getTime() ou son équivalent pour obtenir les valeurs d'heure en millisecondes. Générez ensuite une variable aléatoire long dans cette plage.

1
Stephen C

IMO, la meilleure bibliothèque de date/heure en Java est JodaTime.

Si vous souhaitez un TimeStam aléatoire en 2012 par exemple, vous devez commencer par créer la date du 01/01/2012, puis ajouter un nombre de fois aléatoire. En fin de compte, créez un objet TimeStamp avec le constructeur long:

org.joda.time.DateTime tempDateTime = org.joda.time.DateTimeFormat.forPattern("yyyy-MM-dd").parseDateTime("2012-01-01").plusMillis(my_random_value);
return new Timestamp(tempDateTime .getMillis())
1
jocelyn

Commencez par découvrir le début de l'année 2012:

    long start2012 = new SimpleDateFormat("yyyy").parse("2012").getTime();

Obtenez une milliseconde aléatoire au cours de l'année:

    final long millisInYear2012 = 1000 * 60 * 60 * 24 * 365 + 1000; // Have to account for the leap second!
    long millis = Math.round(millisInYear2012 * Math.random());
    Timestamp timeStamp = new Timestamp(start2012 + millis);
1
Keppil

Regardez cette méthode:

public static Timestamp 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;
    return new Timestamp(offset + (long) (Math.random() * diff));
}
0
Alberto Cerqueira
import org.joda.time.*;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;

    DateTime d1 =DateTime.now().withZone(DateTimeZone.UTC);
        DateTime d0 = d1.minusSeconds(20);
        DateTime d2 = d1.plusSeconds(20);



        Random r = new Random();
        long t1 = d0.getMillis();
        long t2 = d2.getMillis();
        //DateTime d1 = new DateTime(t1);
        //DateTime d2 = new DateTime(t2);
        Random random = new Random();
        long Rand = t1 + (long) (random.nextDouble() * (t2-t1));

        DateTime randDatetime = new DateTime(Rand);

        String datestr= randDatetime.toString("MM/dd/YYYY hh:mm:ss") ;
        System.out.println(datestr) ;
0
donald

Le code suivant génère un horodatage aléatoire pour l'année 2012.

    DateFormat dateFormat = new SimpleDateFormat("yyyy");
    Date dateFrom = dateFormat.parse("2012");
    long timestampFrom = dateFrom.getTime();
    Date dateTo = dateFormat.parse("2013");
    long timestampTo = dateTo.getTime();
    Random random = new Random();
    long timeRange = timestampTo - timestampFrom;
    long randomTimestamp = timestampFrom + (long) (random.nextDouble() * timeRange);
0
vbezhenar

Autrement 

public static Timestamp getRandomTime(){

  Random r = new Random();
  int Low = 100;
  int High = 1500;
  int Result = r.nextInt(High-Low) + Low;
  int ResultSec = r.nextInt(High-Low) + Low;

  Calendar calendar = Calendar.getInstance();
  calendar.add(Calendar.MINUTE, - Result);
  calendar.add(Calendar.SECOND, - ResultSec);

  Java.sql.Timestamp ts = new Java.sql.Timestamp(calendar.getTimeInMillis());
  return ts;
}
0
vsingh