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?
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));
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);
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()));
}
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.
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())
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);
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));
}
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) ;
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);
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;
}