方法1.使用set,传入年,月,日,初始化Calendar:

package com.java.demo;

import java.util.Calendar;

public class DateUtil {
	
	public static void main(String[] args){
		//当前时间
		Calendar cl = setCalendar(2014,01,01);
		System.out.print("当前时间:");
		printCalendar(cl);
		//前一天
		cl = setCalendar(2014,01,01);
		getBeforeDay(cl);
		System.out.print("前一天:");
		printCalendar(cl);
		//后一天
		cl = setCalendar(2014,01,01);
		getAfterDay(cl);
		System.out.print("后一天:");
		printCalendar(cl);
	}
	
	/**
	 * 设置时间
	 * @param year
	 * @param month
	 * @param date
	 * @return
	 */
	public static Calendar setCalendar(int year,int month,int date){
		Calendar cl = Calendar.getInstance();
        //注意,在初始化calendar的时候,传入的日期为当前日期-1(显示值和实际值是不一致的)
		cl.set(year, month-1, date);
		return cl;
	}
	
	/**
	 * 获取当前时间的前一天时间
	 * @param cl
	 * @return
	 */
	private static Calendar getBeforeDay(Calendar cl){
		//使用roll方法进行向前回滚
		//cl.roll(Calendar.DATE, -1);
		//使用set方法直接进行设置
		int day = cl.get(Calendar.DATE);
		cl.set(Calendar.DATE, day-1);
		return cl;
	}
	
	/**
	 * 获取当前时间的后一天时间
	 * @param cl
	 * @return
	 */
	private static Calendar getAfterDay(Calendar cl){
		//使用roll方法进行回滚到后一天的时间
		//cl.roll(Calendar.DATE, 1);
		//使用set方法直接设置时间值
		int day = cl.get(Calendar.DATE);
		cl.set(Calendar.DATE, day+1);
		return cl;
	}
	
	/**
	 * 打印时间
	 * @param cl
	 */
	public static void printCalendar(Calendar cl){
		int year = cl.get(Calendar.YEAR);
		int month = cl.get(Calendar.MONTH)+1;
		int day = cl.get(Calendar.DATE);
		System.out.println(year+"-"+month+"-"+day);
	}
	
}

上面的代码就是说明了set方法和roll方法的使用,传入一个Calendar,进行设置之后返回一个Calendar,但是roll和set有一个区别:为了测试出这两个方法的却别,我们将时间设置成一个边界值:2014-01-01:看运行效果:

是通过set方法进行设置的时间的效果图:

Java 系统中 夏令时处理 java calendar 设置时间_java

通过效果图我们可以看到,set方法获取前一天和后一天的时间是没有任何问题的。下面再来看一下roll方法获取前一天和后一天的时间的效果图:

Java 系统中 夏令时处理 java calendar 设置时间_Java 系统中 夏令时处理_02

我们发现在获取前一天的时间的时候出现问题了,就是2014-01-01获取前一天是2014-01-31,由此我们可以看到,roll方法在获取前一天和后一天的时候并不是级联改动的,只会修改当前的day,而不会考虑year和month,当然他在修改day的时候是一个循环的修改,如:1月份是:1-31,就是一个循环。

通过上面的分析我们看到了set方法和roll方法的区别了。

方法2.使用set,传入util.Date,初始化Calendar:

Date now= new Date();
Calendar calendar = Calendar.getInstance();
calendar.setTime(now);
//获取当前时间前一天
calendar.set(Calendar.DATE, date.get(Calendar.DATE) - 1);
//获取当前时间前一年
calendar.set(Calendar.YEAR, date.get(Calendar.YEAR)+1);
Date newDate = calendar.getTime();

方法3使用add:

endTime = new Date();
Calendar calendar=new GregorianCalendar(); 
calendar.setTime(endTime);
//当前时间加一年
calendar.add(calendar.YEAR,1);
//当前时间前一个月
calendar.add(calendar.MONTH,-1);
startTime = calendar.getTime();
return SUCCESS;

 

Calendar,获取月份少一月的问题及其它注意事项

import java.util.*;
public class DateClass
{
    public static void main(String args[ ])
    {
        Date m = new Date( );
        System.out.println("现在是:"+m.toString( ));
        Calendar n = Calendar.getInstance( );
        int year = n.get(Calendar.YEAR);
        int month = n.get(Calendar.MONTH)+1;
        int day = n.get(Calendar.DATE);
        int week = n.get(Calendar.DAY_OF_WEEK)-1;
        Date t = n.getTime ( );
        String week1 = new String("日一二三四五六");
        String week2=week1.substring(week, week+1);
        String x = new String( );
        x = "现在是:"+year+"年"+month+"月"+day+"日,星期"+week2;
        System.out.println("现在是:"+t);
        System.out.println(x);
    }
}
  • MONTH加1的原因: 
    public static final int MONTH 指示月份的 get 和 set 的字段数字。这是一个特定于日历的值。在格里高利历和罗马儒略历中一年中的第一个月是 JANUARY,它为 0;最后一个月取决于一年中的月份数。 简单来说,因为这个值的初始值是0,因此我们要用它来表示正确的月份时就需要加1。
  • WEEK减1的原因: 
    public static final int DAY_OF_WEEK get 和 set 的字段数字,指示一个星期中的某天。该字段可取的值为 SUNDAY、MONDAY、TUESDAY、WEDNESDAY、THURSDAY、FRIDAY 和 SATURDAY 观察代码,你会发现其实week是用来确定随后的字符串week1该如何截取的,我们知道DAY_OF_WEEK是获取当前日期是一周中的第几天,而一周从周日算起,因此当我们取得这个值之后,为了要正确的截取出随后的字符串week1中的那个中文字符,因此它需要减1来达到目的。你只要跟踪一下程序运行,观察变量的赋值就会理解它这样编写的用意了。
  • 定义day时不用加减的原因: 
    public static final int DATE get 和 set 的字段数字,指示一个月中的某天。它与 DAY_OF_MONTH 是同义词。一个月中第一天的值为 1。 根据定义我们可以知道,这个值取得后不需要做任何变更就是程序需要的值。
  • substring(week, week+1): 
    public String substring(int beginIndex, int endIndex) 返回一个新字符串,它是此字符串的一个子字符串。该子字符串从指定的 beginIndex 处开始,直到索引 endIndex - 1 处的字符。因此,该子字符串的长度为 endIndex-beginIndex。 根据定义,我们就知道这个方法的用途了。举例来说,假如今天是星期四,那么之前获得的week的值就是4,因为我们取到了DAY_OF_WEEK(这里是5)后又减了1,然后我们用这个变量week来帮助我们截取字符串week1,这里调用了substring(4,5),所以取到的字符就是“四,正是我们需要的字符。