<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    love fish大鵬一曰同風(fēng)起,扶搖直上九萬里

    常用鏈接

    統(tǒng)計

    積分與排名

    friends

    link

    最新評論

    求兩時間點之間日期差的簡潔方法(轉(zhuǎn))

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

     

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

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


    ====
    同事在網(wǎng)上找到的方法:

    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);


    結(jié)果應(yīng)該是正確的,它根本就沒有時分秒,有了時分秒與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);
      }

     

    看起來很復(fù)雜吧,沒有求證過,應(yīng)該是正確的吧!

    posted on 2007-05-16 14:54 liaojiyong 閱讀(2592) 評論(1)  編輯  收藏 所屬分類: Java

    評論

    # re: 求兩時間點之間日期差的簡潔方法(轉(zhuǎn)) 2010-07-09 14:49 袁耀輝

    恩 很好  回復(fù)  更多評論   

    主站蜘蛛池模板: 免费的黄网站男人的天堂 | 国产精品免费一区二区三区 | 亚洲精品视频免费| 久久免费美女视频| 亚洲夂夂婷婷色拍WW47| 亚洲精品麻豆av| 国产卡一卡二卡三免费入口| 免费夜色污私人影院网站电影| 久久精品国产亚洲av麻豆| 成人男女网18免费视频| 国产做国产爱免费视频| 亚洲国产中文在线二区三区免| 亚洲国产综合精品一区在线播放| 2020因为爱你带字幕免费观看全集| 亚洲国产无线乱码在线观看 | 毛片a级毛片免费播放100| 国产免费福利体检区久久| 午夜在线a亚洲v天堂网2019 | 国产亚洲Av综合人人澡精品| 亚洲国产精品婷婷久久| 又大又黄又粗又爽的免费视频| 久久99国产乱子伦精品免费| 成人免费观看男女羞羞视频| 亚洲av乱码一区二区三区香蕉| 亚洲精品国偷自产在线| 国产成人精品免费直播 | 国产精品免费看香蕉| 永久黄色免费网站| 最新久久免费视频| 免费很黄无遮挡的视频毛片| va天堂va亚洲va影视中文字幕| 亚洲va无码专区国产乱码| 国产成人免费高清在线观看| 久久精品免费全国观看国产| 国产va在线观看免费| 久久九九久精品国产免费直播| 亚洲AV无码AV日韩AV网站| 亚洲人妖女同在线播放| 亚洲一区二区电影| 亚洲av综合色区| 亚洲精品中文字幕乱码三区|