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));
}
}
日历、时间日期、星期、月份的算法(Calendar类对日期的处理)
最新推荐文章于 2023-06-17 13:11:32 发布