使用 java.time 生成随机 LocalDate
Generate a random LocalDate with java.time
我正在编写一些代码以使用随机数据填充 MySQL 数据库以用于测试目的。我需要使用 1970-2015 的随机日期填充 DATE
列。
相关方法如下:
public Date dateGenerator() throws Exception {
Random ry = new Random();
Random rm = new Random();
Random rd = new Random();
int year = 1969 + ry.nextInt(2015-1969+1);
int month = 1 + rm.nextInt(12);
int day = 1 + rm.nextInt(31);
if (month==2 && day>28){
day = day - 3;
} else {
if((month%2==0 && month != 8 ) && day==31 ){
day = day -1;
}
}
}
我的目的是创建三个随机整数(日、月、年)并以某种方式将它们组合成某个 Date 对象以传递给数据库。但是数据库拒绝了我尝试提供给它的所有内容。
如果可能的话,如果你能向我提供基于最新 java.time
库的建议,那将对我很有教育意义。
一个简单的方法是将最小和最大日期转换为相应的纪元日,在这两个值之间生成一个随机整数,最后将其转换回 LocalDate
。纪元日是通过 toEpochDay()
获得的,这是自 1970-01-01 (ISO) 以来的天数。
生成随机年份、月份和日期的问题在于,您极有可能会遇到无效日期(例如 2 月 31 日)。此外,采用随机纪元日可以保证在所有可能的日期之间均匀分布。
public static void main(String... args) {
long minDay = LocalDate.of(1970, 1, 1).toEpochDay();
long maxDay = LocalDate.of(2015, 12, 31).toEpochDay();
long randomDay = ThreadLocalRandom.current().nextLong(minDay, maxDay);
LocalDate randomDate = LocalDate.ofEpochDay(randomDay);
System.out.println(randomDate);
}
请注意,由于最小日期实际上是第一个,您可以将其替换为 0。
要将这个LocalDate
转换成java.sql.Date
,可以参考:
java.sql.Date date = java.sql.Date.valueOf(randomDate);
尝试这样的事情。
public static void main(String[] args) {
LocalDate start = LocalDate.of(1970, Month.JANUARY, 1);
long days = ChronoUnit.DAYS.between(start, LocalDate.now());
LocalDate randomDate = start.plusDays(new Random().nextInt((int) days + 1));
System.out.println(randomDate);
}
我正在编写一些代码以使用随机数据填充 MySQL 数据库以用于测试目的。我需要使用 1970-2015 的随机日期填充 DATE
列。
相关方法如下:
public Date dateGenerator() throws Exception {
Random ry = new Random();
Random rm = new Random();
Random rd = new Random();
int year = 1969 + ry.nextInt(2015-1969+1);
int month = 1 + rm.nextInt(12);
int day = 1 + rm.nextInt(31);
if (month==2 && day>28){
day = day - 3;
} else {
if((month%2==0 && month != 8 ) && day==31 ){
day = day -1;
}
}
}
我的目的是创建三个随机整数(日、月、年)并以某种方式将它们组合成某个 Date 对象以传递给数据库。但是数据库拒绝了我尝试提供给它的所有内容。
如果可能的话,如果你能向我提供基于最新 java.time
库的建议,那将对我很有教育意义。
一个简单的方法是将最小和最大日期转换为相应的纪元日,在这两个值之间生成一个随机整数,最后将其转换回 LocalDate
。纪元日是通过 toEpochDay()
获得的,这是自 1970-01-01 (ISO) 以来的天数。
生成随机年份、月份和日期的问题在于,您极有可能会遇到无效日期(例如 2 月 31 日)。此外,采用随机纪元日可以保证在所有可能的日期之间均匀分布。
public static void main(String... args) {
long minDay = LocalDate.of(1970, 1, 1).toEpochDay();
long maxDay = LocalDate.of(2015, 12, 31).toEpochDay();
long randomDay = ThreadLocalRandom.current().nextLong(minDay, maxDay);
LocalDate randomDate = LocalDate.ofEpochDay(randomDay);
System.out.println(randomDate);
}
请注意,由于最小日期实际上是第一个,您可以将其替换为 0。
要将这个LocalDate
转换成java.sql.Date
,可以参考
java.sql.Date date = java.sql.Date.valueOf(randomDate);
尝试这样的事情。
public static void main(String[] args) {
LocalDate start = LocalDate.of(1970, Month.JANUARY, 1);
long days = ChronoUnit.DAYS.between(start, LocalDate.now());
LocalDate randomDate = start.plusDays(new Random().nextInt((int) days + 1));
System.out.println(randomDate);
}