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

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

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

    Java 企業(yè)應(yīng)用
    不要溫柔的走入那個(gè)良夜

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

    ====
    我的方法:

    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ù),減少乘法計(jì)算的開銷
    }

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

    ====
    我的同事Kun給出了方法:獲取二者的milliseconds相減,然后/24/60/60。
    這個(gè)方法應(yīng)該是不正確的。因?yàn)槊霐?shù)相減,得到的是二者的時(shí)間差,并沒有濾掉時(shí)分秒。
    計(jì)算結(jié)果:用剛才的例子驗(yàn)算一下,date2.getTime() - date1.getTime() 等于相當(dāng)于23小時(shí)的秒數(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)該是正確的,它根本就沒有時(shí)分秒,有了時(shí)分秒與Kun的方法等價(jià)。不過用起來會很麻煩,因?yàn)橐鹊玫阶址娜掌冢拍苡盟?

    ====
    最后看看大牛的方法:
    大牛博客地址: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 2012-04-16 18:15 cpegtop 閱讀(3420) 評論(1)  編輯  收藏
    Comments
    • # re: 用Java求兩時(shí)間點(diǎn)之間日期差的簡潔方法
      打算打
      Posted @ 2015-02-06 18:00
      試了試,大牛的是正確的  回復(fù)  更多評論   

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


    網(wǎng)站導(dǎo)航:
     
     
    主站蜘蛛池模板: 亚洲五月综合缴情婷婷| 国产亚洲精品拍拍拍拍拍| 亚洲第一视频网站| 一个人看的免费观看日本视频www| 99无码人妻一区二区三区免费| 久久久久久久综合日本亚洲| 日韩电影免费在线观看网址| 国产性生交xxxxx免费| 亚洲s码欧洲m码吹潮| 妞干网手机免费视频| 亚洲国产av玩弄放荡人妇| 成年女人午夜毛片免费看| 国产亚洲精品VA片在线播放| 欧美三级在线电影免费| 亚洲人av高清无码| 日韩特黄特色大片免费视频| 亚洲精品精华液一区二区| 国产精品另类激情久久久免费 | 国产亚洲色视频在线| 永久免费AV无码网站国产| 亚洲高清视频免费| 久久不见久久见免费影院| 亚洲狠狠婷婷综合久久| 亚洲一级特黄大片无码毛片| 中文在线免费不卡视频| 亚洲第一二三四区| 在线免费观看国产视频| 中文无码日韩欧免费视频| 亚洲AV无码成人精品区天堂| 57PAO成人国产永久免费视频| 亚洲人成欧美中文字幕| 亚洲日韩乱码中文无码蜜桃臀网站 | 日韩成人免费视频播放| www免费黄色网| 一本天堂ⅴ无码亚洲道久久| 亚洲一区二区三区国产精品| 国产曰批免费视频播放免费s| 美女被免费网站视频在线| 337p日本欧洲亚洲大胆艺术| 国产色婷婷精品免费视频| 国产午夜无码精品免费看|