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

Java中在時(shí)間戳計(jì)算的過(guò)程中遇到的數(shù)據(jù)溢出問(wèn)題

開(kāi)發(fā) 后端
今天在跑定時(shí)任務(wù)的過(guò)程中,發(fā)現(xiàn)有一個(gè)任務(wù)在設(shè)置數(shù)據(jù)的查詢時(shí)間范圍異常,出現(xiàn)了開(kāi)始時(shí)間戳比結(jié)束時(shí)間戳大的奇怪現(xiàn)象,計(jì)算時(shí)間戳的代碼大致如下。

 背景

[[441841]]

今天在跑定時(shí)任務(wù)的過(guò)程中,發(fā)現(xiàn)有一個(gè)任務(wù)在設(shè)置數(shù)據(jù)的查詢時(shí)間范圍異常,出現(xiàn)了開(kāi)始時(shí)間戳比結(jié)束時(shí)間戳大的奇怪現(xiàn)象,計(jì)算時(shí)間戳的代碼大致如下。

  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.     } 

先放出結(jié)論:因?yàn)閖ava中整數(shù)默認(rèn)是int類型,在計(jì)算的過(guò)程中30 * 24 * 60 * 60 * 1000計(jì)算結(jié)果大于Integer.MAX_VALUE,所以出現(xiàn)了數(shù)據(jù)溢出,從而導(dǎo)致了計(jì)算結(jié)果不準(zhǔn)確的問(wèn)題。

驗(yàn)證

我們將上面的代碼稍稍改造一下,方便我們確認(rèn)定位問(wèn)題,調(diào)整后的代碼如下:

  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. }   

結(jié)果如下:

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

這和我們的預(yù)期不一樣,因?yàn)?0 * 86400000 = 2592000000,但是計(jì)算出來(lái)卻是:-1702967296。

到這里想必大家都知道原因了,這是因?yàn)閖ava中整數(shù)的默認(rèn)類型是整型int,而int的最大值是2147483647,

在代碼中java是先計(jì)算右值,再賦值給long變量的。在計(jì)算右值的過(guò)程中(int型相乘)發(fā)生溢出,然后將溢出后截?cái)嗟闹蒂x給變量,導(dǎo)致了結(jié)果不準(zhǔn)確。

將代碼做一下小小的改動(dòng),再看一下。

  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.     } 

結(jié)果為

  1. end  : 1560869539864 minus mills : 2592000000 
  2. start: 1558277539864 

似乎這樣應(yīng)該就沒(méi)有什么問(wèn)題了,但是這樣就真的保險(xiǎn)了嗎,如果我要把30調(diào)整為24856(Integer.MAX_VALUE / 86400 = 24855),即改為:long a = 24856 * 24 * 60 * 60 * 1000L 那么同樣會(huì)出現(xiàn)溢出。

因?yàn)閖ava的運(yùn)算規(guī)則從左到右,再與最后一個(gè)long型的1000相乘之前就已經(jīng)溢出,所以結(jié)果也不對(duì),正確的方式應(yīng)該如下: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.     } 

 

責(zé)任編輯:華軒 來(lái)源: 今日頭條
相關(guān)推薦

2021-03-06 10:25:19

內(nèi)存Java代碼

2021-02-03 15:12:08

java內(nèi)存溢出

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

配置靜態(tài)路由

2023-02-28 16:26:46

推薦系統(tǒng)模塊

2010-09-27 13:45:38

2023-08-29 11:38:27

Java內(nèi)存

2010-09-26 15:53:25

JVM內(nèi)存溢出

2020-07-29 08:03:26

Celery異步項(xiàng)目

2019-10-28 14:07:29

研發(fā)管理技術(shù)

2024-09-09 08:02:27

2015-07-09 10:36:40

iOS

2012-02-14 13:39:57

Java

2011-04-11 13:28:31

Oracle安裝

2011-04-11 13:25:59

Sybase安裝

2021-08-05 08:32:27

React開(kāi)發(fā)項(xiàng)目

2021-11-15 15:43:28

Windows 11升級(jí)微軟

2013-05-08 09:14:35

網(wǎng)絡(luò)維護(hù)網(wǎng)吧網(wǎng)管
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 欧美午夜激情在线 | 一本色道精品久久一区二区三区 | 国产精品一区二区久久精品爱微奶 | 久久国产成人 | 久久逼逼| 波多野结衣一区二区三区在线观看 | 午夜精品久久久久久久久久久久久 | 久久久网| 2022精品国偷自产免费观看 | 国产精品不卡一区 | 九九久久国产 | 欧美在线一区二区三区 | 久久久一二三区 | 爱爱免费视频 | 成人小视频在线 | 天天综合干 | 99亚洲 | 在线欧美视频 | 96av麻豆蜜桃一区二区 | 中文字幕国产精品 | 亚洲视频免费观看 | 夜夜草视频 | 中文字幕在线一区二区三区 | 欧美一级欧美一级在线播放 | 第一色在线 | 国产一区二区在线播放 | 色资源站| 美女精品一区 | 日韩av三区 | 成人毛片在线观看 | 欧美成人自拍视频 | 美国一级毛片a | 色噜噜亚洲男人的天堂 | 国产激情综合五月久久 | 国产精品久久久久久吹潮 | 国产精品美女久久久久久久网站 | 黑人精品 | 亚洲1区 | 特黄级国产片 | 91久久电影 | 日本精品一区二区三区在线观看视频 |