日历、时间日期、星期、月份的算法(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));
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值