一、首先看如下代码
public static void main(String[] args) {
Long now = 1562724994000L;//查询时间结束的毫秒数
Long old = 1560132994000L;//查询时间开始的毫秒数
long startTime=now/(1000*3600*24)*(1000*3600*24)-TimeZone.getDefault().getRawOffset()+1000*3600*24;//查询时间结束的第二天零点零分零秒的毫秒数
long endTime=startTime+24*60*60*1000-1;//查询时间的第二天23点59分59秒的毫秒数
long oldDay=old/(1000*3600*24)*(1000*3600*24)-TimeZone.getDefault().getRawOffset();//查询时间开始的零点零分零秒的毫秒数
Long day = (startTime-oldDay)/(24*60*60*1000);
for(int i=0;i<day;i++){
startTime = startTime-24*60*60*1000;
endTime = endTime-24*60*60*1000;
String zeroFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(startTime);
String zeroFormat1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(endTime);
System.out.println("第"+i+"天:");
System.out.print("时间:"+zeroFormat);
System.out.print(" 时间戳:"+startTime+";");
System.out.print(" 时间:"+zeroFormat1);
System.out.println(" 时间戳:"+endTime);
}
}输出结果如下:
第0天: 时间:2019-07-10 00:00:00 时间戳:1562688000000; 时间:2019-07-10 23:59:59 时间戳:1562774399999
第1天: 时间:2019-07-09 00:00:00 时间戳:1562601600000; 时间:2019-07-09 23:59:59 时间戳:1562687999999
============
.....中间省略......
============
第23天: 时间:2019-06-17 00:00:00 时间戳:1560700800000; 时间:2019-06-17 23:59:59 时间戳:1560787199999
第24天: 时间:2019-06-16 00:00:00 时间戳:1560614400000; 时间:2019-06-16 23:59:59 时间戳:1560700799999
第25天: 时间:2019-06-15 00:00:00 时间戳:1560528000000; 时间:2019-06-15 23:59:59 时间戳:1560614399999
第26天: 时间:2019-06-14 00:00:00 时间戳:1560441600000; 时间:2019-06-14 23:59:59 时间戳:1560527999999
第27天: 时间:2019-06-13 00:00:00 时间戳:1560355200000; 时间:2019-06-13 23:59:59 时间戳:1560441599999
第28天: 时间:2019-06-12 00:00:00 时间戳:1560268800000; 时间:2019-06-12 23:59:59 时间戳:1560355199999
第29天: 时间:2019-06-11 00:00:00 时间戳:1560182400000; 时间:2019-06-11 23:59:59 时间戳:1560268799999
第30天: 时间:2019-06-10 00:00:00 时间戳:1560096000000; 时间:2019-06-10 23:59:59 时间戳:1560182399999
二、再看如下代码
public static void main(String[] args) {
Long now = 1562724994000L;//查询时间结束的毫秒数
Long old = 1560132994000L;//查询时间开始的毫秒数
long zeroDay=now/(1000*3600*24)*(1000*3600*24)-TimeZone.getDefault().getRawOffset();//查询时间结束的零点零分零秒的毫秒数
long twelve=zeroDay+24*60*60*1000-1;//查询时间的23点59分59秒的毫秒数
long oldDay=old/(1000*3600*24)*(1000*3600*24)-TimeZone.getDefault().getRawOffset();//查询时间开始的零点零分零秒的毫秒数
Long day = (zeroDay-oldDay)/(24*60*60*1000);
for(int i=0;i<=day;i++){
Long startTime = zeroDay-24*60*60*1000*i;
Long endTime = twelve-24*60*60*1000*i;
String zeroFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(startTime);
String zeroFormat1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(endTime);
System.out.print("第"+i+"天:");
System.out.print("时间:"+zeroFormat);
System.out.print(" 时间戳:"+startTime+";");
System.out.print(" 时间:"+zeroFormat1);
System.out.println(" 时间戳:"+endTime);
}
}输出结果如下:
第0天:时间:2019-07-10 00:00:00 时间戳:1562688000000; 时间:2019-07-10 23:59:59 时间戳:1562774399999
第1天:时间:2019-07-09 00:00:00 时间戳:1562601600000; 时间:2019-07-09 23:59:59 时间戳:1562687999999
============
.....中间省略......
============
第23天:时间:2019-06-17 00:00:00 时间戳:1560700800000; 时间:2019-06-17 23:59:59 时间戳:1560787199999
第24天:时间:2019-06-16 00:00:00 时间戳:1560614400000; 时间:2019-06-16 23:59:59 时间戳:1560700799999
第25天:时间:2019-08-03 17:02:47 时间戳:1564822967296; 时间:2019-08-04 17:02:47 时间戳:1564909367295
第26天:时间:2019-08-02 17:02:47 时间戳:1564736567296; 时间:2019-08-03 17:02:47 时间戳:1564822967295
第27天:时间:2019-08-01 17:02:47 时间戳:1564650167296; 时间:2019-08-02 17:02:47 时间戳:1564736567295
第28天:时间:2019-07-31 17:02:47 时间戳:1564563767296; 时间:2019-08-01 17:02:47 时间戳:1564650167295
第29天:时间:2019-07-30 17:02:47 时间戳:1564477367296; 时间:2019-07-31 17:02:47 时间戳:1564563767295
第30天:时间:2019-07-29 17:02:47 时间戳:1564390967296; 时间:2019-07-30 17:02:47 时间戳:1564477367295
注意看两个输出部分的划线部分,你会发现他们不一样......
System.out.println(1560614400000L-24*60*60*1000*25);当我们进行如上输出的时候,会发现 提示 Numeric overflow in expression 错误...... 翻译过来就是 表达式中的数字溢出
因为我们后面是用 24*60*60*1000*25的计算方式计算,算出来的是int类型,但是计算值超出了int的值范围 所以提示 Numeric overflow in expression 错误
System.out.println(1560614400000L-24*60*60*1000L*25);我们使用上面 24*60*60*1000L*25 的计算就会用long型进行计算,则不会出现溢出的情况,当然也就不会出现上面代码中时间计算不准确的情况了