1. 程式人生 > >【小家java】Java中對時間戳相加減的問題(向前推100天,答案卻讓我匪夷所思)

【小家java】Java中對時間戳相加減的問題(向前推100天,答案卻讓我匪夷所思)

相關閱讀

【小家java】java5新特性(簡述十大新特性) 重要一躍
【小家java】java6新特性(簡述十大新特性) 雞肋升級
【小家java】java7新特性(簡述八大新特性) 不溫不火
【小家java】java8新特性(簡述十大新特性) 飽受讚譽
【小家java】java9新特性(簡述十大新特性) 褒貶不一
【小家java】java10新特性(簡述十大新特性) 小步迭代
【小家java】java11新特性(簡述八大新特性) 首個重磅LTS版本


序言

關於時間的計算,會體現在我們程式的方方面面。然後我最近在寫一個需求的時候,躺了一個大坑

需求概要

我的需求大概是這樣的:我寫了一個任務,每天晚上去執行。會把當前時間三天以前的資料都拿出來處理,然後這個x天的變數是我隨意可變可傳的。開始預設的值是3,後來改成5都相安無事,資料處理正確。

但是某一天我手動觸發任務的時候,傳值100的時候,問題出現了
貼出我的時間計算程式碼:

 //往前推算x天
        int dayCount = 10;
        
        Long endTime = System.currentTimeMillis();
        Long startTime = endTime - (dayCount * 24 * 60 * 60 * 1000);
        System.out.println(new Date(endTime)); //Mon Oct 29
        System.out.println(new Date(startTime)
); //Fri Oct 19

當這個dayCount值還是10 的時候,顯然是沒有問題的。現在我們調高到100,看看輸出:

 //往前推算x天
        int dayCount = 100;

        Long endTime = System.currentTimeMillis();
        Long startTime = endTime - (dayCount * 24 * 60 * 60 * 1000);
        System.out.println(new Date(endTime)); //Mon Oct 29
        System.out.println(new
Date(startTime)); //Sun Oct 28

竟然,竟然只往前前進了一天。
如果我們往前推200天呢?

 //往前推算x天
        int dayCount = 100;

        Long endTime = System.currentTimeMillis();
        Long startTime = endTime - (dayCount * 24 * 60 * 60 * 1000);
        System.out.println(new Date(endTime)); //Mon Oct 29
        System.out.println(new Date(startTime)); //Sun Oct 28

更加大跌眼鏡
偶買噶,直接導致我的任務計算錯誤了,損失不小啊,抹淚。。。

分析原因

表面上看上去,完全沒有問題,為毛出問題了呢?
其實,這個就是考驗一個程式設計師的JDK基本功了,然後我就猜測,有沒有可能是後面的計算值是int值,然後計算出來的結果超過了int的最大值,產生了溢位呢?

為了證明我的猜想,做如下簡單試驗:

System.out.println(100 * 24 * 60 * 60 * 1000);  //50065408
System.out.println(Integer.MAX_VALUE);  //2147483647

奇怪把,100天的時間戳,超出了Integer的最大值,所以產生了溢位。

基礎知識:java的預設型別為int、double等,使用的時候一定需要引起注意

如何解決?

解決辦法其實很簡單,重點在於分析找原因的過程。需要基礎知識的儲備,和一步步的探索
解決辦法:使用long裝載

Long startTime = endTime - (dayCount * 24 * 60 * 60 * 1000L);

只需要尾部加個L輕鬆解決。

像這種影式的的型別問題,非常的隱蔽。可能數值小的時候很和諧不會出問題,但數字大了,就出現問題了,而且非常不好定位問題的根源,因此編碼的時候一定要規範,能顯示寫出來的東西,不用影式的處理