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

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

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇