在指定时间范围内随机生成一个时间

作者: tcxurun 分类: Java 发布时间: 2013-08-29 21:54 ė 6 没有评论

今天由于要模拟数据,要在指定时间范围内随机生成一个时间,比如指定日期范围在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生成随机数的时候会出现错误,导致生成的日期不对。

本文出自天一直很蓝,转载时请注明出处及相应链接。

本文永久链接: http://www.tcxurun.cn/archives/72

发表评论

电子邮件地址不会被公开。 必填项已用*标注

Ɣ回顶部