Java日期计算(Calendar类)

openkk 12年前

主要学习的日期操作主要是-----获取日期字段(年、月、日、年中的天数、年中的周数等)、计算两个时间的间隔日期(年、月、天)、根据开始时间间隔时间计算结束时间。

       关于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类)