comment générer un timestamp aléatoire en java?

je veux à la génération aléatoire d'horodatage et d'ajouter un incrément aléatoire pour générer un second horodatage. est-ce possible?

si je passe des valeurs aléatoires longues pour créer un timestamp et que je veux générer au hasard cette valeur longue, quelles seraient les contraintes pour générer cette valeur pour donner un timestamp en 2012 par exemple?

13
demandé sur Sami 2012-06-13 17:51:45

10 réponses

vous devez mettre à l'échelle le nombre aléatoire pour être dans la gamme d'une année spécifique, et ajouter le début de l'année comme la compensation. Le nombre de millisecondes dans une année varie d'une année à l'autre (les années bissextiles ont une journée supplémentaire, certaines années ont des minutes bissextiles, et ainsi de suite), de sorte que vous pouvez déterminer la gamme avant de mettre à l'échelle comme suit:

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));
40
répondu dasblinkenlight 2012-06-13 14:02:12

pour votre exemple la valeur longue à passer dans la Date doit être 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
répondu Aleksandr Kravets 2012-06-13 14:09:17

utilisez ApacheCommonUtils pour générer un aléatoire long dans une gamme donnée, puis créer Date à partir de cette longue.

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
répondu uris 2013-08-12 04:40:29

vous pouvez générer un horodatage aléatoire en générant un long aléatoire dans la gamme appropriée et en le traitant ensuite comme un horodatage de précision milliseconde; par exemple new Date(long) .

pour déterminer la plage, créer un objet date ou Calendrier (ou similaire) qui représente la date de début et la date de fin de la plage, et appeler le long getTime() ou l'équivalent pour obtenir les valeurs de temps millisecondes. Puis générer un long aléatoire dans cette gamme.

1
répondu Stephen C 2012-06-13 13:58:59

IMO, la meilleure bibliothèque date time en java est JodaTime.

si vous voulez un horaire aléatoire en 2012 par exemple, vous devriez commencer par créer la date 01/01/2012 et ensuite ajouter un nombre aléatoire de temps. À la fin, 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
répondu jocelyn 2012-06-13 14:02:19

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

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

aléatoire milliseconde 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
répondu Keppil 2012-06-14 08:17:57

le code suivant génère une date 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
répondu vbezhenar 2012-06-13 14:06:25

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
répondu Alberto Cerqueira 2016-12-08 18:55:06

un Autre chemin

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
répondu vsingh 2017-01-03 21:27:37
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
répondu donald 2017-10-28 09:02:00