一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Java中在時間戳計算的過程中遇到的數據溢出問題解決

Java中在時間戳計算的過程中遇到的數據溢出問題解決

2019-06-29 16:33翎野君 Java教程

這篇文章主要介紹了Java中在時間戳計算的過程中遇到的數據溢出問題解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

背景

今天在跑定時任務的過程中,發現有一個任務在設置數據的查詢時間范圍異常,出現了開始時間戳比結束時間戳大的奇怪現象,計算時間戳的代碼大致如下。

package com.lingyejun.authenticator;
 
public class IntegerTest {
 
  public static void main(String[] args) {
    long endTime = System.currentTimeMillis();
    long startTime = endTime - 30 * 24 * 60 * 60 * 1000;
 
    System.out.println("end  : " + endTime);
    System.out.println("start : " + startTime);
  }
}

先放出結論:因為java中整數默認是int類型,在計算的過程中30 * 24 * 60 * 60 * 1000計算結果大于Integer.MAX_VALUE,所以出現了數據溢出,從而導致了計算結果不準確的問題。

驗證

我們將上面的代碼稍稍改造一下,方便我們確認定位問題,調整后的代碼如下:

package com.lingyejun.authenticator;
 
public class IntegerTest {
 
  public static long calcStartTime(long endTime, long minusMills) {
    System.out.println("end : " + endTime + " minus mills : " + minusMills);
    long startTime = endTime - minusMills;
    System.out.println("start: " + startTime);
    return startTime;
  }
 
  public static void main(String[] args) {
    long nowTime = System.currentTimeMillis();
    long a = 30 * 24 * 60 * 60 * 1000;
    calcStartTime(nowTime, a);
  }
} 

結果如下:

end  : 1560869539864 minus mills : -1702967296
start: 1562572507160

這和我們的預期不一樣,因為30 * 86400000 = 2592000000,但是計算出來卻是:-1702967296。

到這里想必大家都知道原因了,這是因為java中整數的默認類型是整型int,而int的最大值是2147483647,

在代碼中java是先計算右值,再賦值給long變量的。在計算右值的過程中(int型相乘)發生溢出,然后將溢出后截斷的值賦給變量,導致了結果不準確。

將代碼做一下小小的改動,再看一下。

package com.lingyejun.authenticator;
 
public class IntegerTest {
 
  public static long calcStartTime(long endTime, long minusMills) {
    System.out.println("end : " + endTime + " minus mills : " + minusMills);
    long startTime = endTime - minusMills;
    System.out.println("start: " + startTime);
    return startTime;
  }
 
  public static void main(String[] args) {
    long nowTime = System.currentTimeMillis();
    long a = 30 * 24 * 60 * 60 * 1000L;
    calcStartTime(nowTime, a);
  }
}

結果為

end  : 1560869539864 minus mills : 2592000000
start: 1558277539864

似乎這樣應該就沒有什么問題了,但是這樣就真的保險了嗎,如果我要把30調整為24856(Integer.MAX_VALUE / 86400 = 24855),即改為:long a = 24856 * 24 * 60 * 60 * 1000L 那么同樣會出現溢出。

因為java的運算規則從左到右,再與最后一個long型的1000相乘之前就已經溢出,所以結果也不對,正確的方式應該如下:long a = 24856L * 24 * 60 * 60 * 1000。

package com.lingyejun.authenticator;
 
public class IntegerTest {
 
  public static long calcStartTime(long endTime, long minusMills) {
    System.out.println("end : " + endTime + " minus mills : " + minusMills);
    long startTime = endTime - minusMills;
    System.out.println("start: " + startTime);
    return startTime;
  }
 
  public static void main(String[] args) {
    long a = 30L * 24 * 60 * 60 * 1000;
    calcStartTime(nowTime, a);
  }
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 欧美一区二区三 | 国产精品污双胞胎在线观看 | caoporen97免费公开视频 | 日韩精品欧美激情国产一区 | 亚洲天堂视频在线免费观看 | 国产一卡2卡3卡四卡国色天香 | 色婷婷婷丁香亚洲综合不卡 | 亚洲性网 | 桃色导航 | 国产一级黄毛片 | 无码精品一区二区三区免费视频 | 情乱奶水欲 | 91亚洲一区二区在线观看不卡 | 护士柔佳| 晓雪老师我要进你里面好爽 | 国产极品麻豆91在线 | 美女被的视频 | 国产悠悠视频在线播放 | 欧美一区二区三区大片 | 黄片毛片| 日本久久免费大片 | 亚洲国产欧美在线成人aaaa | 互换娇妻爽文100系列小说 | 免费特黄一级欧美大片 | 美女叽叽| 色欲麻豆国产福利精品 | 欧美三级小说 | 欧美亚洲激情在线 | 精品无人区一区二区三区 | 香蕉tv国产在线永久播放 | 国产一级黄色录像 | 99久久免费国产精品热 | 女同xx美女放 | 99午夜| 亚洲不卡视频 | 四虎国产视频 | 四虎在线永久免费视频网站 | 456亚洲老头视频 | 2021最新国产成人精品视频 | 四缺一的小说 | 国色天香社区视频免费高清在线观看 |