Java 企業應用
          不要溫柔的走入那個良夜

            原來以為,求兩個時間之日期差應該不是問題,直到有一天...。 我曾經輔導過的一位開發員向我求教,我還不以為很難,嘗試用Calendar/GregorianCalendar類來計算,看起來代碼太復雜,放棄。苦想半小時,最后想出一句話,寫出來在MSN上發給他。當時的感覺路子很野,上不了臺面。這句話也是下面要介紹的簡潔方法。
          再后來,我的一位前同事發來郵件,說起網上一大牛發布的blog,是一個牛人數落Java標準庫的,挺有意思。需求很簡單:有兩個Date型的變量(a, b),如何計算兩者相隔的天數?你有簡單的解決方案嗎?(據這個牛人說,還是很麻煩的哦)
          看了大牛的方法,暗地思忖:既然Java標準庫不能解決,我的方法不是很簡單嗎?!我的底氣騰騰往上漲。

          ====
          我的方法:

          public long differ(Date date1, Date date2)
          {
          //return date1.getTime() / (24*60*60*1000) - date2.getTime() / (24*60*60*1000);
          return date2.getTime() / 86400000 - date1.getTime() / 86400000;  //用立即數,減少乘法計算的開銷
          }

          問題分析:求日期差,重要的是時間對象的日期部分,與時分秒沒有關系。所以問題的關鍵是過濾掉時分秒,保留日期部分。干的活象低通濾波器,濾掉高頻雜波,保留低頻信號。
          解決思路:一天的秒數是24*60*60*1000=86400000=Senconds。時間對象date1.getTime()是自1970年1月1日零點以來的秒數,用它整除以Seconds,就得到自1970年1月1日以來的天數。注意這里用的是整除符號,時分秒被過濾掉了。對date2也施行同樣的操作,得到date2的天數。date2的天數減去date1的天數,所得結果就是日期差。
          舉例來說,用最簡單的例子,假設date1等于1970年1月5日15點整,date2等于1970年1月6日14點整。date1整除以seconds的結果是4,date2整除以seconds的結果是5,date2與date1相差5-4=1天,與我們的預期相符。

          ====
          我的同事Kun給出了方法:獲取二者的milliseconds相減,然后/24/60/60。
          這個方法應該是不正確的。因為秒數相減,得到的是二者的時間差,并沒有濾掉時分秒。
          計算結果:用剛才的例子驗算一下,date2.getTime() - date1.getTime() 等于相當于23小時的秒數,再整除以seconds,結果是0天,與預期的1天不相符。
          Kun的方法與正確方法的區別在于:先做減法,還是先做整除法。

          ====
          同事在網上找到的方法:

          SimpleDateFormat myFormatter = new SimpleDateFormat("yyyy-MM-dd");
          java.util.Date date= myFormatter.parse("2003-05-1");
          java.util.Date mydate= myFormatter.parse("1899-12-30");
          long  day=(date.getTime()-mydate.getTime())/(24*60*60*1000);
          out.println(day);

          結果應該是正確的,它根本就沒有時分秒,有了時分秒與Kun的方法等價。不過用起來會很麻煩,因為要先得到字符串的日期,才能用它。

          ====
          最后看看大牛的方法:
          大牛博客地址:http://blog.csdn.net/rmartin/archive/2006/12/22/1452867.aspx

          private int daysBetween(Date now, Date returnDate) {
              Calendar cNow = Calendar.getInstance();
              Calendar cReturnDate = Calendar.getInstance();
              cNow.setTime(now);
              cReturnDate.setTime(returnDate);
              setTimeToMidnight(cNow);
              setTimeToMidnight(cReturnDate);
          long todayMs = cNow.getTimeInMillis();
          long returnMs = cReturnDate.getTimeInMillis();
          long intervalMs = todayMs - returnMs;
          return millisecondsToDays(intervalMs);
            }

          private int millisecondsToDays(long intervalMs) {
          return (int) (intervalMs / (1000 * 86400));
            }

          private void setTimeToMidnight(Calendar calendar) {
              calendar.set(Calendar.HOUR_OF_DAY, 0);
              calendar.set(Calendar.MINUTE, 0);
              calendar.set(Calendar.SECOND, 0);
            }

          看起來很復雜吧,沒有求證過,應該是正確的吧!

          posted on 2012-04-16 18:15 cpegtop 閱讀(3419) 評論(1)  編輯  收藏
          Comments
          • # re: 用Java求兩時間點之間日期差的簡潔方法
            打算打
            Posted @ 2015-02-06 18:00
            試了試,大牛的是正確的  回復  更多評論   

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
           
          主站蜘蛛池模板: 宁武县| 马龙县| 老河口市| 浠水县| 垦利县| 临漳县| 正阳县| 南雄市| 揭东县| 元谋县| 天等县| 苍梧县| 资溪县| 鹿邑县| 南汇区| 舞钢市| 中阳县| 闽侯县| 固阳县| 江永县| 友谊县| 鄂温| 凤凰县| 五大连池市| 虎林市| 县级市| 长垣县| 万荣县| 上高县| 新邵县| 旅游| 晋江市| 文山县| 景宁| 兴和县| 永康市| 盐城市| 南京市| 临城县| 奉贤区| 双鸭山市|