java 中Date方法getTime取到的毫秒数误差问题

今天写两个指定范围内的随机日期时 想通过gettime取到一天的毫秒数然后限定范围
总是取不到完整的30天的毫秒数只能取到20天的
代码如下

public class TT {
public static void main(String[] args) throws Exception {
	SimpleDateFormat sd=new SimpleDateFormat("yyyy-MM-dd");
	Date pp = sd.parse("1970-01-02");	
	long time = pp.getTime();
	System.out.println(new Date(time));
	for (int i = 1; i < 30; i++) {
		System.out.println(sd.format(new Date((long) (time*i))));
	}

}
}

取到的值如下

1970-01-02
1970-01-02
1970-01-03
1970-01-04
1970-01-04
1970-01-05
1970-01-06
1970-01-06
1970-01-07
1970-01-08
1970-01-08
1970-01-09
1970-01-10
1970-01-10
1970-01-11
1970-01-12
1970-01-12
1970-01-13
1970-01-14
1970-01-14
1970-01-15
1970-01-16
1970-01-16
1970-01-17
1970-01-18
1970-01-18
1970-01-19
1970-01-20
1970-01-20

查到的值少了2/3 本来以为是使用方法的问题去查了api和好多资料
在看度娘的时候突然看到了时区两个字突然想到了这里是东8区 gettime初始时间是从 1970-01-01 08-00-00开始计算的
测试代码如下

public class TT {
public static void main(String[] args) throws Exception {
	SimpleDateFormat sd=new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");
	Date pp = sd.parse("1970-01-01 01-00-00");	
	long time = pp.getTime();
	for (int i = 1; i < 30; i++) {
		System.out.println(sd.format(new Date((long) (time*i))));
	}

}
}

结果如下

1970-01-01 01-00-00
1969-12-31 18-00-00
1969-12-31 11-00-00
1969-12-31 04-00-00
1969-12-30 21-00-00
1969-12-30 14-00-00
1969-12-30 07-00-00
1969-12-30 00-00-00
1969-12-29 17-00-00
1969-12-29 10-00-00
1969-12-29 03-00-00
1969-12-28 20-00-00
1969-12-28 13-00-00
1969-12-28 06-00-00
1969-12-27 23-00-00
1969-12-27 16-00-00
1969-12-27 09-00-00
1969-12-27 02-00-00
1969-12-26 19-00-00
1969-12-26 12-00-00
1969-12-26 05-00-00
1969-12-25 22-00-00
1969-12-25 15-00-00
1969-12-25 08-00-00
1969-12-25 01-00-00
1969-12-24 18-00-00
1969-12-24 11-00-00
1969-12-24 04-00-00
1969-12-23 21-00-00

取到的时间一直在后退证明了猜想然后就开始写需求

public class T8 {
	
public static String t8(String d,int i) throws Exception {
	SimpleDateFormat sd=new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");
	SimpleDateFormat sd2=new SimpleDateFormat("yyyy-MM-dd");
	Date p = sd2.parse(d);
	Date pp = sd.parse("1970-01-02 08-00-00");
	long t2 = p.getTime();
	//一天的毫秒数
	long t = pp.getTime();
	//三十天的毫秒数
    long endtime=t*i;
    double random = Math.random();
    //random(),
	long r =(long)(random*(endtime+1))+t2;
	Date date = new Date(r);
	String format = sd2.format(date);
	return format;	
}
public static void main(String[] args) throws Exception {
	for (int i = 0; i < 30; i++) {
		String t8 = T8.t8("2012-10-20", 30);
		System.out.println(t8);
	}
}
}

运行结果

2012-11-17
2012-10-22
2012-11-14
2012-10-20
2012-11-14
2012-11-13
2012-11-03
2012-11-10
2012-11-10
2012-11-10
2012-11-04
2012-11-03
2012-10-31
2012-11-10
2012-11-17
2012-11-08
2012-10-28
2012-11-07
2012-11-03
2012-11-01
2012-11-04
2012-11-11
2012-10-26
2012-11-03
2012-10-31
2012-11-03
2012-11-15
2012-11-14
2012-10-31
2012-10-26

运行数据正常能取到所有范围内的值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值