我正在尝试为Joda Time创建一个种子点。我试图实现的是,我将在Joda Time中提供种子datetime
,这将生成两个不同的随机datetime
,使得datetime1
在datetime2
之前,并且该datetime
将仅生成种子点的特定小时的值。
例如
time- 18:00:00 followed by date-2013-02-13
Random1 - 2013-02-13 18:05:24
Random2 - 2013-02-13 18:48:22
时间从一个DB接收,日期由用户选择。我需要以指定格式随机生成的两次您可以看到,只有分钟和秒会更改,其他内容都不会更改。
这可能吗?我怎样才能做到这一点?
下面的代码应该可以随心所欲。如果种子时间中的分钟或秒可能不为零,则应在.parseDateTime(inputDateTime)
方法调用后添加.withMinuteOfHour(0).withSecondOfMinute(0)。
import java.util.Random;
import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
public class RandomTime {
DateTimeFormatter inputFormat = DateTimeFormat.forPattern("HH:mm:ss yyyy-MM-dd");
DateTimeFormatter outputFormat = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss");
public TwoRandomTimes getRandomTimesFromSeed(String inputDateTime) {
DateTime seed = inputFormat.parseDateTime(inputDateTime);
Random random = new Random();
int seconds1 = random.nextInt(3600);
int seconds2 = random.nextInt(3600 - seconds1);
DateTime time1 = new DateTime(seed).plusSeconds(seconds1);
DateTime time2 = new DateTime(time1).plusSeconds(seconds2);
return new TwoRandomTimes(time1, time2);
}
public class TwoRandomTimes {
public final DateTime random1;
public final DateTime random2;
private TwoRandomTimes(DateTime time1, DateTime time2) {
random1 = time1;
random2 = time2;
}
@Override
public String toString() {
return "Random1 - " + outputFormat.print(random1) + "nRandom2 - " + outputFormat.print(random2);
}
}
public static void main(String[] args) {
RandomTime rt = new RandomTime();
System.out.println(rt.getRandomTimesFromSeed("18:00:00 2013-02-13"));
}
}
在该解决方案中,第一随机时间确实被用作第二随机时间的下界。另一种解决方案是只获取两个随机日期,然后对它们进行排序。
我可能会选择以下内容:
final Random r = new Random();
final DateTime suppliedDate = new DateTime();
final int minute = r.nextInt(60);
final int second = r.nextInt(60);
final DateTime date1 = new DateTime(suppliedDate).withMinuteOfHour(minute).withSecondOfMinute(second);
final DateTime date2 = new DateTime(suppliedDate).withMinuteOfHour(minute + r.nextInt(60 - minute)).withSecondOfMinute(second + r.nextInt(60 - second));
假设suppliedDate
是数据库中的日期。然后你根据你的种子时间生成两个新的时间,随机分秒。您还可以通过更改计算的随机数的边界来保证第二次是在第一次之后。