熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

java日期計算簡析

2013-11-23 18:58:31  來源: Java核心技術 

  今天主要學習的日期操作主要是—–獲取日期字段(年年中的天數年中的周數等)計算兩個時間的間隔日期(年天)根據開始時間間隔時間計算結束時間
   
    關於Calendar日歷的字段值一些比較重要的如下
   
    常規的年月日時分秒
   
    static int YEAR
   
    指示年的 get 和 set 的字段數字
   
    static int MONTH
   
    指示月份的 get 和 set 的字段數字
   
    static int DATE
   
    get 和 set 的字段數字指示一個月中的某天
   
    static int HOUR
   
    get 和 set 的字段數字指示上午或下午的小時
   
    static int MINUTE
   
    get 和 set 的字段數字指示一小時中的分鐘
   
    static int SECOND
   
    get 和 set 的字段數字指示一分鐘中的秒
   
    比較有用的幾個字段
   
    static int DAY_OF_YEAR
   
    get 和 set 的字段數字指示當前年中的天數
   
    static int WEEK_OF_YEAR
   
    get 和 set 的字段數字指示當前年中的星期數
   
    static int WEEK_OF_MONTH
   
    get 和 set 的字段數字指示當前月中的星期數
   
    static int DAY_OF_WEEK
   
    get 和 set 的字段數字指示一個星期中的某天
   
    下面是關於日期計算的測試代碼雖然較長但是調理很清晰
   
    /**
   
    * 日期類DateCalendar測試類
   
    *
   
    */
   
    package comdate_test;
   
    import javatextDateFormat;
   
    import javatextParseException;
   
    import javatextSimpleDateFormat;
   
    import javautilCalendar;
   
    import javautilDate;
   
    /**
   
    * @author wkupaochuan
   
    * @time Jun
   
    * @version V
   
    *
   


    * 實現的接口如下
   
    * 根據開始時間和間隔天數計算結束時間 Date calculateEndDate(Date sDate int days)
   
    * 根據開始時間結束時間間隔類型(年日)計算間隔時間 int calInterval(Date sDate Date eDate String type)
   
    * 輸出日歷實例(當前時間)的各個字段值 void printFields(Calendar cNow)
   
    * 判定某個年份是否是閏年 boolean isLeapYear(int year)
   
    * 比較兩個日期的大小 int compareDate(Date sDate Date eDate)
   
    */
   
    public class Calendar_test {
   
    public static void main(String agrs[])
   
    {
   
    //獲取日歷實例並賦予當前時間
   
    Calendar cNow = CalendargetInstance()
   
    cNowsetTime(new Date())
   
    //輸出日歷相關字段
   
    printFields(cNow)
   
    /*計算兩個日期的時間間隔*/
   
    //開始時間
   
    Date sDate = new Date()
   
    //結束時間
   
    try {
   
    Date eDate = (new SimpleDateFormat(yyyyMMdd))parse(
   
    //計算結果並輸出
   
    Systemoutprintln(今天與相隔 + calInterval(sDate eDate d) +
   
    } catch (ParseException e) {
   
    // TODO Autogenerated catch block
   
    eprintStackTrace()
   
    }
   
    /*計算結束日期並輸出*/
   
    SimpleDateFormat df = (SimpleDateFormat)DateFormatgetInstance()
   
    dfapplyPattern(yyyyMMdd
   
    Systemoutprintln(從幾天開始計算天後是 + dfformat(calculateEndDate(sDate )))
   
    }
   
    /**
   
    * 根據起始日期和間隔時間計算結束日期
   
    *
   
    * @param sDate開始時間
   
    *
   
    * @param days間隔時間
   
    *
   
    * @return 結束時間
   
    * */
   
    public static Date calculateEndDate(Date sDate int days)
   
    {
   
    //將開始時間賦給日歷實例
   
    Calendar sCalendar = CalendargetInstance()
   
    sCalendarsetTime(sDate)
   
    //計算結束時間
   
    sCalendaradd(CalendarDATE days)
   
    //返回Date類型結束時間
   
    return sCalendargetTime()
   
    }
   
    /**
       



    * 計算兩個日期的時間間隔
   
    *
   
    * @param sDate開始時間
   
    *
   
    * @param eDate結束時間
   
    *
   
    * @param type間隔類型(Y/y年  M/m月  D/d日)
   
    *
   
    * @return interval時間間隔
   
    * */
   
    private static int calInterval(Date sDate Date eDate String type)
   
    {
   
    //時間間隔初始為
   
    int interval = ;
   
    /*比較兩個日期的大小如果開始日期更大則交換兩個日期*/
   
    //標志兩個日期是否交換過
   
    boolean reversed = false;
   
    if(compareDate(sDate eDate) >
   
    {
   
    Date dTest = sDate;
   
    sDate = eDate;
   
    eDate = dTest;
   
    //修改交換標志
   
    reversed = true;
   
    }
       



    /*將兩個日期賦給日歷實例並獲取年日相關字段值*/
   
    Calendar sCalendar = CalendargetInstance()
   
    sCalendarsetTime(sDate)
   
    int sYears = sCalendarget(CalendarYEAR)
   
    int sMonths = sCalendarget(CalendarMONTH)
   
    int sDays = sCalendarget(CalendarDAY_OF_YEAR)
   
    Calendar eCalendar = CalendargetInstance()
   
    eCalendarsetTime(eDate)
   
    int eYears = eCalendarget(CalendarYEAR)
   
    int eMonths = eCalendarget(CalendarMONTH)
   
    int eDays = eCalendarget(CalendarDAY_OF_YEAR)
   
    //年
   
    if(cTrim(type)equals(Y) || cTrim(type)equals(y))
   
    {
   
    interval = eYears sYears;
   
    if(eMonths < sMonths)
   
    {
   
    interval;
   
    }
   
    }
   
    //月
   
    else if(cTrim(type)equals(M) || cTrim(type)equals(m))
   
    {
   
    interval = * (eYears sYears)
   
    interval += (eMonths sMonths)
   
    }
   
    //日
   
    else if(cTrim(type)equals(D) || cTrim(type)equals(d))
   
    {
   
    interval = * (eYears sYears)
   
    interval += (eDays sDays)
   
    //除去閏年天數
   
    while(sYears < eYears)
   
    {
   
    if(isLeapYear(sYears))
   
    {
   
    interval;
   
    }
   
    ++sYears;
   
    }
   
    }   



    
    //如果開始日期更大則返回負值
   
    if(reversed)
   
    {
   
    interval = interval;
   
    }
   
    //返回計算結果
   
    return interval;
   
    }
   
    /**
   
    * 輸出日歷相關字段(當前日期)
   
    *
   
    * @param cNow當前時間
   
    *
   
    * @return null
   
    *
   
    * 各個字段值都可以用get(field)得到也可以用set(field value)函數修改
   
    * */
   
    private static void printFields(Calendar cNow)
   
    {
   
    //先用Date類型輸出驗證
   
    SimpleDateFormat df = (SimpleDateFormat)DateFormatgetInstance()
   
    dfapplyPattern(yyyyMMdd  HH:mm:ss
   
    Systemoutprintln(標准日期 + dfformat(new Date()))
   
    //逐個輸出相關字段值
   
    Systemoutprint(年份 + cNowget(CalendarYEAR) + \t
   
    //月份有問題(這裡的月份開始計數為
   
    Systemoutprint(月份 + cNowget(CalendarMONTH) + \t
   
    Systemoutprint(日期 + cNowget(CalendarDATE) + \t
   
    Systemoutprint(小時 + cNowget(CalendarHOUR) + \t
   
    Systemoutprint(分鐘 + cNowget(CalendarMINUTE) + \t
   
    Systemoutprintln(秒鐘 + cNowget(CalendarSECOND))
   
    //本年的第幾天在計算時間間隔的時候有用
   
    Systemoutprintln(一年中的天數 + cNowget(CalendarDAY_OF_YEAR))
   
    Systemoutprintln(一年中的周數 + cNowget(CalendarWEEK_OF_YEAR))
   
    //即本月的第幾周
   
    Systemoutprintln(一月中的周數 + cNowget(CalendarWEEK_OF_MONTH))
   
    //即一周中的第幾天(這裡是以周日為第一天的)
   
    Systemoutprintln(一周中的天數 + cNowget(CalendarDAY_OF_WEEK))
   
    }
   
    /**
   
    * 判定某個年份是否是閏年
   
    *
   
    * @param year待判定的年份
   
    *
   
    * @return 判定結果
   
    * */
   
    private static boolean isLeapYear(int year)
   
    {
   
    return (year% == || (year% == && year% != ))
   
    }
   
    /**
   
    *
   
    * 字符串去除兩頭空格如果為空則返回如果不空則返回該字符串去掉前後空格
   
    *
   
    * @param tStr輸入字符串
   
    *
   
    * @return 如果為空則返回如果不空則返回該字符串去掉前後空格
   
    *
   
    */
   
    public static String cTrim(String tStr)
   
    {
   
    String ttStr = ;
   
    if (tStr == null)
   
    {}
   
    else
   
    {
   
    ttStr = tStrtrim()
   
    }
   
    return ttStr;
   
    }
   
    /**   



    
    * 比較兩個Date類型的日期大小
   
    *
   
    * @param sDate開始時間
   
    *
   
    * @param eDate結束時間
   
    *
   
    * @return result返回結果(相同  前者大  後者大)
   
    * */
   
    private static int compareDate(Date sDate Date eDate)
   
    {
   
    int result = ;
   
    //將開始時間賦給日歷實例
   
    Calendar sC = CalendargetInstance()
   
    sCsetTime(sDate)
   
    //將結束時間賦給日歷實例
   
    Calendar eC = CalendargetInstance()
   
    eCsetTime(eDate)
   
    //比較
   
    result = pareTo(eC)
   
    //返回結果
   
    return result;
   
    }
   
    }
   
    程序執行結果如下

   


From:http://tw.wingwit.com/Article/program/Java/hx/201311/26056.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.