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