Java日期計算(Calendar類)

openkk 12年前發布 | 118K 次閱讀 Java Java開發

主要學習的日期操作主要是-----獲取日期字段(年、月、日、年中的天數、年中的周數等)、計算兩個時間的間隔日期(年、月、天)、根據開始時間間隔時間計算結束時間。

       關于Calendar日歷的字段值,我從JDK中摘抄了一些我認為比較重要的,如下:

常規的年月日時分秒:
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 的字段數字,指示一個星期中的某天。

下面是關于日期計算的測試代碼,雖然較長,但是調理很清晰。

/**
 * 日期類Date、Calendar測試類
 * 
 */
package com.date_test;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * @author wkupaochuan
 * @time Jun 14, 2012
 * @version V 1.0
 * 
 * 實現的接口如下:
 * 1---根據開始時間和間隔天數計算結束時間 Date calculateEndDate(Date sDate, int days)
 * 2---根據開始時間、結束時間、間隔類型(年、月、日)計算間隔時間 int calInterval(Date sDate, Date eDate, String type)
 * 3---輸出日歷實例(當前時間)的各個字段值 void printFields(Calendar cNow)
 * 4---判定某個年份是否是閏年 boolean isLeapYear(int year)
 * 5---比較兩個日期的大小 int compareDate(Date sDate, Date eDate)
 */
public class Calendar_test {

    public static void main(String agrs[])
    {
        //獲取日歷實例并賦予當前時間
        Calendar cNow = Calendar.getInstance();
        cNow.setTime(new Date());
        //輸出日歷相關字段
        printFields(cNow);

        /*計算兩個日期的時間間隔*/
        //開始時間
        Date sDate = new Date();
        //結束時間
        try {
            Date eDate = (new SimpleDateFormat("yyyy-MM-dd")).parse("2012-05-29");
            //計算結果并輸出
            System.out.println("今天與2020-05-29相隔:" + calInterval(sDate, eDate, "d") + "天");
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        /*計算結束日期并輸出*/
        SimpleDateFormat df = (SimpleDateFormat)DateFormat.getInstance();
        df.applyPattern("yyyy-MM-dd");
        System.out.println("從幾天開始計算,2天后是:" + df.format(calculateEndDate(sDate, 2)));
    }

    /**
     * 根據起始日期和間隔時間計算結束日期
     * 
     * @param sDate開始時間
     * 
     * @param days間隔時間
     * 
     * @return 結束時間
     * */
    public static Date calculateEndDate(Date sDate, int days)
    {
        //將開始時間賦給日歷實例
        Calendar sCalendar = Calendar.getInstance();
        sCalendar.setTime(sDate);
        //計算結束時間
        sCalendar.add(Calendar.DATE, days);
        //返回Date類型結束時間
        return sCalendar.getTime();
    }

    /**
     * 計算兩個日期的時間間隔
     * 
     * @param sDate開始時間
     * 
     * @param eDate結束時間
     * 
     * @param type間隔類型("Y/y"--年  "M/m"--月  "D/d"--日)
     * 
     * @return interval時間間隔
     * */
    private static int calInterval(Date sDate, Date eDate, String type)
    {
        //時間間隔,初始為0
        int interval = 0;

        /*比較兩個日期的大小,如果開始日期更大,則交換兩個日期*/
        //標志兩個日期是否交換過
        boolean reversed = false;
        if(compareDate(sDate, eDate) > 0)
        {
            Date dTest = sDate;
            sDate = eDate;
            eDate = dTest;
            //修改交換標志
            reversed = true;
        }

        /*將兩個日期賦給日歷實例,并獲取年、月、日相關字段值*/
        Calendar sCalendar = Calendar.getInstance();
        sCalendar.setTime(sDate);
        int sYears = sCalendar.get(Calendar.YEAR);
        int sMonths = sCalendar.get(Calendar.MONTH);
        int sDays = sCalendar.get(Calendar.DAY_OF_YEAR);

        Calendar eCalendar = Calendar.getInstance();
        eCalendar.setTime(eDate);
        int eYears = eCalendar.get(Calendar.YEAR);
        int eMonths = eCalendar.get(Calendar.MONTH);
        int eDays = eCalendar.get(Calendar.DAY_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 = 12 * (eYears - sYears);
            interval += (eMonths - sMonths);
        }
        //日
        else if(cTrim(type).equals("D") || cTrim(type).equals("d"))
        {
            interval = 365 * (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)DateFormat.getInstance();
        df.applyPattern("yyyy-MM-dd  HH:mm:ss");
        System.out.println("標準日期:" + df.format(new Date()));
        //逐個輸出相關字段值
        System.out.print("年份:" + cNow.get(Calendar.YEAR) + "\t");
        //月份有問題(這里的月份開始計數為0)
        System.out.print("月份:" + cNow.get(Calendar.MONTH) + "\t");
        System.out.print("日期:" + cNow.get(Calendar.DATE) + "\t");
        System.out.print("小時:" + cNow.get(Calendar.HOUR) + "\t");
        System.out.print("分鐘:" + cNow.get(Calendar.MINUTE) + "\t");
        System.out.println("秒鐘:" + cNow.get(Calendar.SECOND));
        //本年的第幾天,在計算時間間隔的時候有用
        System.out.println("一年中的天數:" + cNow.get(Calendar.DAY_OF_YEAR));
        System.out.println("一年中的周數:" + cNow.get(Calendar.WEEK_OF_YEAR));
        //即本月的第幾周
        System.out.println("一月中的周數:" + cNow.get(Calendar.WEEK_OF_MONTH));
        //即一周中的第幾天(這里是以周日為第一天的)
        System.out.println("一周中的天數:" + cNow.get(Calendar.DAY_OF_WEEK));
    }

     /**
      * 判定某個年份是否是閏年
      * 
      * @param year待判定的年份
      * 
      * @return 判定結果
      * */
     private static boolean isLeapYear(int year)
     {
         return (year%400 == 0 || (year%4 == 0 && year%100 != 0));
     }

    /**
    * 
    * 字符串去除兩頭空格,如果為空,則返回"",如果不空,則返回該字符串去掉前后空格
    * 
    * @param tStr輸入字符串
    * 
    * @return 如果為空,則返回"",如果不空,則返回該字符串去掉前后空格
    * 
    */
    public static String cTrim(String tStr) 
    {
        String ttStr = "";
        if (tStr == null) 
        {} 
        else 
        {
            ttStr = tStr.trim();
        }
        return ttStr;
    }

    /**
     * 比較兩個Date類型的日期大小
     * 
     * @param sDate開始時間
     * 
     * @param eDate結束時間
     * 
     * @return result返回結果(0--相同  1--前者大  2--后者大)
     * */
    private static int compareDate(Date sDate, Date eDate)
    {
        int result = 0;
        //將開始時間賦給日歷實例
        Calendar sC = Calendar.getInstance();
        sC.setTime(sDate);
        //將結束時間賦給日歷實例
        Calendar eC = Calendar.getInstance();
        eC.setTime(eDate);
        //比較
        result = sC.compareTo(eC);
        //返回結果
        return result;
    }

}

程序執行結果如下:

Java日期計算(Calendar類)

 本文由用戶 openkk 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!