java日历的算法,日历、时间日期、星期、月份的算法(Calendar类对日期的处理)...

package cn.keymobile.calendar;

import java.text.SimpleDateFormat;

import java.util.Calendar;

import java.util.Date;

import org.junit.Test;

/**

*@author zhaojd

* Calendar 类测试

*/

public class KeyCalendar {

@Test

public void testCalendar() throws Exception {

/**

* 使用SimpleDateFormat表示的当前时间值

*/

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

System.out.println("现在的时间是:" + sdf.format(new Date()));

/**

* 使用Calendar来表示当前时间值

*/

Calendar calendar = Calendar.getInstance();

calendar.setTime(new Date());

System.out.println("现在的时间是(使用Calendar):" + calendar.get(Calendar.YEAR) //

+ "-" + (calendar.get(Calendar.MONTH) + 1) //

+ "-" + calendar.get(Calendar.DAY_OF_MONTH) + ": 星期" //

+ (calendar.get(Calendar.DAY_OF_WEEK) - 1));

/**

* 计算自己从出生已经度过了多少天

*/

long nowMillis = calendar.getTimeInMillis();

calendar.set(1992, 9, 13);

long bornMillis = calendar.getTimeInMillis();

long days = (nowMillis - bornMillis) / (24 * 60 * 60 * 1000);

System.out.println("从出生到现在我已经度过了" + days + "天;");

}

/**

*@throws Exception 计算某一月份的最大天数

*/

@Test

public void calculateMaxDays() throws Exception {

Calendar calendar = Calendar.getInstance();

/**

* 如果calendar不设置时间,则计算的是1970年1月

*/

calendar.setTime(new Date());

calendar.set(Calendar.YEAR, calendar.get(Calendar.YEAR));

/**

* 这里的Calendar.MONTH = 9;也就是实际的10月份,因为0表示的January

*/

calendar.set(Calendar.MONTH, calendar.get(Calendar.MONTH));

int maxDays = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);

System.out.println(maxDays);

}

/**

* Calendar和Date之间的转换

*

*@throws Exception

*/

@Test

public void convertDateAndCalculate() throws Exception {

/**

* 1. Calendar转化为Date

*/

Calendar calendar = Calendar.getInstance();

Date date = calendar.getTime();

System.out.println(date);

/**

* 2. Date转化为Calendar

*/

Calendar calendar2 = Calendar.getInstance();

calendar2.setTime(new Date());

/**

* 3. 格式化输出日期时间

*/

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

sdf.format(new Date());

/**

* 4. 计算一年中的第几星期

*/

//4.1计算 某一天是一年中的第几星期

Calendar calendar3 = Calendar.getInstance();

calendar3.setTime(new Date());

calendar3.set(Calendar.YEAR, calendar3.get(Calendar.YEAR));

calendar3.set(Calendar.MONTH,calendar3.get(Calendar.MONTH));

calendar3.set(Calendar.DAY_OF_MONTH, 8);

calendar3.get(Calendar.WEEK_OF_YEAR);

//4.2计算一年中的第几星期是几号

Calendar calendar4 = Calendar.getInstance();

calendar4.setTime(new Date());

calendar4.set(Calendar.YEAR, calendar4.get(Calendar.YEAR));

calendar4.set(Calendar.WEEK_OF_YEAR, 2);

calendar4.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);

System.out.println(sdf.format(calendar4.getTime())); //2016-01-04

/**

* 5. add()和roll()的用法

*/

//5.1 add()方法

Calendar calendar5 = Calendar.getInstance();

calendar5.setTime(new Date());

calendar5.set(Calendar.YEAR, calendar5.get(Calendar.YEAR));

calendar5.set(Calendar.MONTH, calendar5.get(Calendar.MONTH));

calendar5.set(Calendar.DAY_OF_MONTH, 6);

calendar5.add(Calendar.DATE, -3);

System.out.println(sdf.format(calendar5.getTime())); //2016-10-03

calendar5.add(Calendar.DATE,3);

System.out.println(sdf.format(calendar5.getTime())); //2016-10-06

//5.2 roll() 方法

Calendar calendar6 = Calendar.getInstance();

calendar6.setTime(new Date());

calendar6.set(Calendar.YEAR, calendar6.get(Calendar.YEAR));

calendar6.set(Calendar.MONTH, calendar6.get(Calendar.MONTH));

calendar6.set(Calendar.DAY_OF_MONTH, 4);

calendar6.roll(Calendar.DATE, -5);

System.out.println(sdf.format(calendar6.getTime()));//2016-10-30

calendar6.roll(Calendar.DATE, 5);

System.out.println(sdf.format(calendar6.getTime()));//2016-10-04

//备注:roll()方法在本月内循环,一般使用add()方法。

}

/**

* 6. 计算两个任意时间中间的间隔天数

*/

//6.1 传入Calendar对象

/**

*

*@param startDay 开始时间

*@param endDay 结束时间

*@return

*@throws Exception

*/

@Test

public long getIntervalDays(Calendar startDay,Calendar endDay) throws Exception {

//确保startDay在endDay之前

if(startDay.after(endDay)){

Calendar cal = startDay;

startDay = endDay;

endDay = cal;

}

long sub = (endDay.getTimeInMillis()) - (startDay.getTimeInMillis());

return (sub) / (24*60*60*1000);

}

//6.2 传入Date对象

/**

* 计算两个时间相隔天数

*@param startDay 开始时间

*@param endDay 结束时间

*@throws Exception

*/

@Test

public long getIntervalDays(Date startDay,Date endDay) throws Exception {

//确保startDay在endDay之前

if(startDay.after(endDay)){

Date date = startDay;

startDay = endDay;

endDay = date;

}

long sub = endDay.getTime() - startDay.getTime();

return sub/24*60*60*1000;

}

/**

* 同理,可以用相同的方法计算出任意两个时间相隔的小时数,分钟数,秒钟数等

* 注:以上方法是完全按时间计算,有时并不能令人满意,如:

* startday="2016-10-11 20:00:00" endday="2016-10-12 8:00:00"

*/

/**

* 7.改进精确计算相隔天数的方法

*@param d1

*@param d2

*@return

*/

@Test

public int getDaysBetween(Calendar d1, Calendar d2) {

if (d1.after(d2)) { // swap dates so that d1 is start and d2 is end

Calendar swap = d1;

d1 = d2;

d2 = swap;

}

int days = d2.get(Calendar.DAY_OF_YEAR) - d1.get(Calendar.DAY_OF_YEAR);

int y2 = d2.get(Calendar.YEAR);

if (d1.get(Calendar.YEAR) != y2) {

d1 = (Calendar) d1.clone();

do {

days += d1.getActualMaximum(Calendar.DAY_OF_YEAR);// 得到当年的实际天数

d1.add(Calendar.YEAR, 1);

} while (d1.get(Calendar.YEAR) != y2);

}

return days;

}

@Test

public void testGetDaysBetween() throws Exception {

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");

Date startTime = sdf.parse("2016-10-11 20:00:00");

Date endTime = sdf.parse("2016-10-12 8:00:00");

Calendar d1 = Calendar.getInstance();

Calendar d2 = Calendar.getInstance();

d1.setTime(startTime);

d2.setTime(endTime);

System.out.println(getDaysBetween(d1, d2));

}

}