今天由于要模拟数据,要在指定时间范围内随机生成一个时间,比如指定日期范围在8月1日到31日,时间在早上8点到下午18点。
主要是用到Calendar类,不是很复杂,但是有个注意的地方,代码如下:
public static Date generateTimeByLimits(Date start, Date end,int startH,int endH) { if(start.before(end)) { Calendar calStart = Calendar.getInstance(); calStart.setTime(start); Calendar calEnd = Calendar.getInstance(); calEnd.setTime(end); Long dif = (calEnd.getTimeInMillis() - calStart.getTimeInMillis())/1000; Random random = new Random(); Integer i = random.nextInt(dif.intValue()); Long m = i.longValue() * 1000; Calendar cal = Calendar.getInstance(); cal.setTimeInMillis(calStart.getTimeInMillis() + m); int hour = random.nextInt(endH - startH) + startH; cal.set(Calendar.HOUR_OF_DAY, hour); return cal.getTime(); } else { return null; } }
测试代码及测试结果如下:
public static void main(String[] args) throws Exception{ String date1 = "2013-08-01 00:00:42"; String date2 = "2013-08-31 23:59:59"; SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date start = formatter.parse(date1); Date end = formatter.parse(date2); for(int i=0; i<30; i++) { Date date = generateTimeByLimits(start, end, 8, 18); System.out.println(formatter.format(date)); } }
2013-08-21 12:31:49 2013-08-05 15:03:19 2013-08-15 12:45:21 2013-08-29 11:39:46 2013-08-20 16:40:55 2013-08-11 13:55:45 2013-08-10 11:19:57 2013-08-01 15:59:56 2013-08-26 17:05:27 2013-08-01 08:48:25 2013-08-19 11:47:29 2013-08-05 15:33:20 2013-08-22 09:25:42 2013-08-01 11:26:06 2013-08-04 16:42:26 2013-08-19 11:21:21 2013-08-12 17:57:09 2013-08-01 09:00:09 2013-08-24 15:38:29 2013-08-10 15:58:16 2013-08-07 11:14:28 2013-08-19 17:16:55 2013-08-18 10:48:20 2013-08-15 17:54:55 2013-08-05 10:57:58 2013-08-30 13:53:55 2013-08-07 15:23:07 2013-08-10 15:07:47 2013-08-18 17:07:04 2013-08-26 10:19:14
产生随机数有两种方式:Math.random()和java.util包下的Random类,在这里使用了java.util包下的Random类产生随机数。
int nextInt()
返回下一个伪随机数,它是此随机数生成器的序列中均匀分布的 int 值。
int nextInt(int n)
返回一个伪随机数,它是从此随机数生成器的序列中取出的、在 0(包括)和指定值(不包括)之间均匀分布的 int值。
没有netxtLong(Long n)方法,由于int类型最大值为2147483648,而Calendar类getTimeInMillis()返回的是从格林威治标准时间 1970 年 1 月 1 日的 00:00:00.000到Calendar对象表示的时间之间的毫秒数,超过了int类型的最大值(比如日期2013-08-01 00:00:00调用getTimeInMillis()返回的值是1375286400000 ),因此在nextInt(int n) 产生时间范围差的随机数要处理一下,在此先除1000,生成时间的时候在乘1000就可以了。如果不经此处理,在nextInt生成随机数的时候会出现错误,导致生成的日期不对。