記一次時間戳操做的問題

1、首先看以下代碼java

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);
    }
}複製代碼

輸出結果以下:express

第0天: 時間:2019-07-10 00:00:00 時間戳:1562688000000; 時間:2019-07-10 23:59:59 時間戳:1562774399999bash

第1天: 時間:2019-07-09 00:00:00 時間戳:1562601600000; 時間:2019-07-09 23:59:59 時間戳:1562687999999
spa

============
翻譯

.....中間省略......
code

 ============
orm

第23天: 時間:2019-06-17 00:00:00 時間戳:1560700800000; 時間:2019-06-17 23:59:59 時間戳:1560787199999
get

第24天: 時間:2019-06-16 00:00:00 時間戳:1560614400000; 時間:2019-06-16 23:59:59 時間戳:1560700799999
string

第25天: 時間:2019-06-15 00:00:00 時間戳:1560528000000; 時間:2019-06-15 23:59:59 時間戳:1560614399999
it

第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

2、再看以下代碼

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型進行計算,則不會出現溢出的狀況,固然也就不會出現上面代碼中時間計算不許確的狀況了

相關文章
相關標籤/搜索