成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

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

 背景

[[441841]]

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

  1. package com.lingyejun.authenticator; 
  2.  
  3. public class IntegerTest { 
  4.  
  5.     public static void main(String[] args) { 
  6.         long endTime = System.currentTimeMillis(); 
  7.         long startTime = endTime - 30 * 24 * 60 * 60 * 1000; 
  8.  
  9.         System.out.println("end   : " + endTime); 
  10.         System.out.println("start : " + startTime); 
  11.     } 

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

驗證

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

  1. package com.lingyejun.authenticator; 
  2.  
  3. public class IntegerTest { 
  4.  
  5.     public static long calcStartTime(long endTime, long minusMills) { 
  6.         System.out.println("end  : " + endTime + " minus mills : " + minusMills); 
  7.         long startTime = endTime - minusMills; 
  8.         System.out.println("start: " + startTime); 
  9.         return startTime; 
  10.     } 
  11.  
  12.     public static void main(String[] args) { 
  13.         long nowTime = System.currentTimeMillis(); 
  14.         long a = 30 * 24 * 60 * 60 * 1000; 
  15.         calcStartTime(nowTime, a); 
  16.     } 
  17. }   

結果如下:

  1. end  : 1560869539864 minus mills : -1702967296 
  2. start: 1562572507160 

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

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

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

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

  1. package com.lingyejun.authenticator; 
  2.  
  3. public class IntegerTest { 
  4.  
  5.     public static long calcStartTime(long endTime, long minusMills) { 
  6.         System.out.println("end  : " + endTime + " minus mills : " + minusMills); 
  7.         long startTime = endTime - minusMills; 
  8.         System.out.println("start: " + startTime); 
  9.         return startTime; 
  10.     } 
  11.  
  12.     public static void main(String[] args) { 
  13.         long nowTime = System.currentTimeMillis(); 
  14.         long a = 30 * 24 * 60 * 60 * 1000L; 
  15.         calcStartTime(nowTime, a); 
  16.     } 

結果為

  1. end  : 1560869539864 minus mills : 2592000000 
  2. 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。

  1. package com.lingyejun.authenticator; 
  2.  
  3. public class IntegerTest { 
  4.  
  5.     public static long calcStartTime(long endTime, long minusMills) { 
  6.         System.out.println("end  : " + endTime + " minus mills : " + minusMills); 
  7.         long startTime = endTime - minusMills; 
  8.         System.out.println("start: " + startTime); 
  9.         return startTime; 
  10.     } 
  11.  
  12.     public static void main(String[] args) { 
  13.         long a = 30L * 24 * 60 * 60 * 1000; 
  14.         calcStartTime(nowTime, a); 
  15.     } 

 

責任編輯:華軒 來源: 今日頭條
相關推薦

2021-03-06 10:25:19

內存Java代碼

2021-02-03 15:12:08

java內存溢出

2016-03-23 11:03:40

2010-05-11 18:05:50

MySQL 5安裝

2022-03-25 09:01:16

CSS溢出屬性

2009-12-10 14:19:41

配置靜態路由

2023-02-28 16:26:46

推薦系統模塊

2010-09-27 13:45:38

2023-08-29 11:38:27

Java內存

2020-07-29 08:03:26

Celery異步項目

2010-09-26 15:53:25

JVM內存溢出

2019-10-28 14:07:29

研發管理技術

2024-09-09 08:02:27

2015-07-09 10:36:40

iOS

2011-04-11 13:28:31

Oracle安裝

2012-02-14 13:39:57

Java

2011-04-11 13:25:59

Sybase安裝

2021-08-05 08:32:27

React開發項目

2021-11-15 15:43:28

Windows 11升級微軟

2013-05-08 09:14:35

網絡維護網吧網管
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人一区在线观看 | 久久综合狠狠综合久久综合88 | 久久久久国产精品一区二区 | 天天看天天干 | 秋霞电影一区二区三区 | 夜色www国产精品资源站 | 特黄色一级毛片 | 欧美精品在线一区二区三区 | 国产中文视频 | 在线观看第一页 | 国产一区二区在线免费 | 波多野结衣中文字幕一区二区三区 | 欧美日韩国产一区二区三区 | 国产精品欧美一区二区三区不卡 | 国产ts人妖另类 | 亚洲成人精品免费 | 日韩精品在线一区 | 欧美一级久久精品 | 国产精品久久久免费 | 狠狠草视频 | 国产日韩av一区二区 | 中文字幕av在线 | 久草在线在线精品观看 | 国产精品1区2区3区 一区中文字幕 | 国产精品日产欧美久久久久 | 四虎永久免费影院 | 亚洲天天干 | 欧美性a视频 | 1000部精品久久久久久久久 | 亚洲精品久久久久久久久久久久久 | 黄色一级大片视频 | a级毛片毛片免费观看久潮喷 | 久久成人一区二区三区 | 欧美毛片免费观看 | 一级毛片色一级 | 欧美高清视频一区 | 免费欧美 | 操久久 | 超碰导航 | 日本久久久久久 | 国产精品国产成人国产三级 |