ランダムなタイムスタンプを生成し、それにランダムな増分を追加して 2 番目のタイムスタンプを生成したいと考えています。それは可能ですか?
ランダムな long 値を渡してタイムスタンプを作成し、その long 値をランダムに生成したい場合、たとえば 2012 年のタイムスタンプを与えるためにこの値を生成するための制約は何でしょうか?
特定の年の範囲内になるように乱数をスケーリングし、年初をオフセットとして追加する必要があります。1 年のミリ秒数は年ごとに変化するため (うるう年には余分な日があり、特定の年にはうるう分があるなど)、次のようにスケーリングする前に範囲を決定できます。
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));
あなたの例では、Date に渡す long 値は、2012年の 1325397600 から 1293861599 の間である必要があります。このサイトを使用して確認してください! ランダムな日付を生成するには、次のようにします。
Random r =new Random();
long unixtime=(long) (1293861599+r.nextDouble()*60*60*24*365);
Date d = new Date(unixtime);
ApacheCommonUtils を使用して、指定された範囲内でランダムな long を生成し、その long から Date を作成します。
例:
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()));
}
long
適切な範囲で乱数を生成し、それをミリ秒精度のタイムスタンプとして扱うことで、ランダムなタイムスタンプを生成できます。例えばnew Date(long)
。
範囲を決定するには、範囲の開始日と終了日を表す Date または Calendar (または同様の) オブジェクトを作成し、long getTime()
または同等の を呼び出してミリ秒の時間値を取得します。long
次に、その範囲で乱数を生成します。
IMO、Java で最高の日時ライブラリは JodaTime です。
たとえば、2012 年のランダムな TimeStam が必要な場合は、2012 年 1 月 1 日の日付を作成してから、ランダムな時間を追加する必要があります。最後に、 long コンストラクターを使用して TimeStamp オブジェクトを作成します。
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())
2012 年の始まりを見つけることから始めます。
long start2012 = new SimpleDateFormat("yyyy").parse("2012").getTime();
年のランダムなミリ秒を取得します。
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);
この方法を見てください:
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));
}
別の方法
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;
}
次のコードは、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);