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

来源:互联网 发布:crt软件是什么 编辑:程序博客网 时间:2024/06/04 23:32
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));    }}
0 0