Calendar 工具类介绍及使用

1. 简介

Calendar 类是一个抽象类,它为特定瞬间与 YEAR、MONTH、DAY_OF—MONTH、HOUR 等日历字段之间的转换提供了一些方法,并为操作日历字段(如获得下星期的日期) 提供了一些方法。创建 Calendar 对象不能使用 new 关键字,因为 Calendar 类是一个抽象类,但是它提供了一个 getInstance() 方法来获得 Calendar类的对象。getInstance() 方法返回一个 Calendar 对象,其日历字段已由当前日期和时间初始化。

Calendar c = Calendar.getInstance();

2. 方法

2.1 set() 方法和add() 方法

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
        
        Calendar c = Calendar.getInstance();
        System.out.println(sdf.format(c.getTime()));  
        c.add(Calendar.DAY_OF_YEAR, -1);
       
        System.out.println(sdf.format(c.getTime()));  
      
        c.set(2018, 12, 20);// 月份是从0开始的,所以11表示12月  
        c.add(Calendar.YEAR, -1); // 年份减1  
        c.add(Calendar.YEAR, +1); // 年份加1  
        c.add(Calendar.MONTH, -1);// 月份减1  
        c.add(Calendar.DATE, -1);// 日期减1  
        c.set(Calendar.HOUR, 1);//设置时为  13点
        c.set(Calendar.MINUTE, 45);//设置分为 45
        c.set(Calendar.SECOND, 30);//设置 秒为30
        System.out.println(sdf.format(c.getTime()));

​ set() 方法是用来设置Calendar 的字段的值的,例如可以设置年月日时分秒等;add() 方法是用来对Calendar 的字段值进行计算的。如果需要减去值可以用负数值。

2.2 将时间戳转为日期数据

    /**
     * @Author lbk
     * @Description // 将时间戳转化为日期
     * @Date 10:29 2022/3/8
     * @Param
     * @return
     **/
    public static String getDate(Long milliSecond) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return simpleDateFormat.format(milliSecond);
    }

2.3 将日期数据转为时间戳

/**
     * @Author lbk
     * @Description // 将日期数据转为时间戳
     * @Date 10:19 2022/3/8
     * @Param
     * @return
     **/
    public static Long getMillis(String date) {
        Calendar instance = Calendar.getInstance();
        try {
            instance.setTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(date));
        }catch (Exception e) {
            e.printStackTrace();
        }
        return  instance.getTimeInMillis();
    }

2.4 获取当月第一天和当前时间时间戳

  /**
     * @Author lbk
     * @Description // 获取当前月份第一天的时间戳以及当前时间的时间戳
     * @Date 10:42 2022/3/8
     * @Param
     * @return Map
     **/
    public static Map<String, Long> getMonthFirstAndCurrent() {
        // 初始化结果map ,用于存储当前月第一天和现在的时间戳
        Map<String, Long> resMap = new HashMap<>();
        Calendar calendar_first = Calendar.getInstance();
        calendar_first.set(Calendar.DATE, 1);
        calendar_first.set(Calendar.HOUR_OF_DAY, 0);
        calendar_first.set(Calendar.MINUTE, 0);
        calendar_first.set(Calendar.SECOND, 0);
        resMap.put("monthFirst", calendar_first.getTimeInMillis());
        Calendar calendar_current = Calendar.getInstance();
        resMap.put("current", calendar_current.getTimeInMillis());
        System.out.println(resMap);
        System.out.println(getDate(calendar_first.getTimeInMillis()));
        System.out.println(getDate(calendar_current.getTimeInMillis()));
        return resMap;
    }
// 输出结果 - getDate 将时间戳转化为日期, Map 里面存时间戳
// 2022-03-01 00:00:00
// 2022-03-08 21:53:45

2.5 获取某年某月的月份的开始和结束时间戳

 /**
     * @Author lbk
     * @Description // 获取某年某月的开始时间戳和解释时间戳,区别于前面的当前时间,这里可以作为参数输入
     * @Date 21:27 2022/3/8
     * @Param
     * @return
     **/
    public static Map<String, Long> getMonthAround(String date) {
        // 初始化结果map ,用于存放指定时间月份的开始时间戳和结束时间戳
        Map<String, Long> resMap = new HashMap<>();
        // 将输入的String 类型解析为 Date 对象一边传入Calendar 中
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM");
        Date monthDate = null;
        try {
            monthDate = simpleDateFormat.parse(date);
        }catch (ParseException e) {
            e.printStackTrace();
        }
        Calendar calendar_lastYearStart = Calendar.getInstance();
        Calendar calendar_lastYearEnd = Calendar.getInstance();
        // 设置输入时间月份的第一天
        calendar_lastYearStart.setTime(monthDate);
        calendar_lastYearStart.set(Calendar.DAY_OF_MONTH, 1);
        calendar_lastYearStart.set(Calendar.HOUR_OF_DAY, 0);
        calendar_lastYearStart.set(Calendar.MINUTE, 0);
        calendar_lastYearStart.set(Calendar.SECOND, 0);
        // 设置输入时间月份的最后一天
        calendar_lastYearEnd.setTime(monthDate);
        calendar_lastYearEnd.set(Calendar.DAY_OF_MONTH, calendar_lastYearEnd.getActualMaximum(Calendar.DAY_OF_MONTH));
        calendar_lastYearEnd.set(Calendar.HOUR_OF_DAY, 23);
        calendar_lastYearEnd.set(Calendar.MINUTE, 59);
        calendar_lastYearEnd.set(Calendar.SECOND, 59);
        System.out.println(getDate(calendar_lastYearStart.getTimeInMillis()));
        System.out.println(getDate(calendar_lastYearEnd.getTimeInMillis()));
        resMap.put("lastYearStart", calendar_lastYearStart.getTimeInMillis());
        resMap.put("lastYearEnd", calendar_lastYearEnd.getTimeInMillis());
        return resMap;
    }
// 2017-02-01 00:00:00
// 2017-02-28 23:59:59

2.6 获取当天的开始和结束时间戳

  /**
     * @Author lbk
     * @Description // 获取当天的开始时间戳和结束时间戳
     * @Date 17:50 2022/3/8
     * @Param
     * @return
     **/
    public static Map<String, Long> getDaysBeginAndEnd() {
        // 初始化结果Map ,用于存储某天开始时间戳和结束时间戳
        Map<String, Long> resMap = new HashMap<>();
        Calendar calendar_begin = Calendar.getInstance();
        Calendar calendar_end = Calendar.getInstance();
        calendar_begin.set(Calendar.HOUR_OF_DAY, 0);
        calendar_begin.set(Calendar.MINUTE, 0);
        calendar_begin.set(Calendar.SECOND, 0);
        resMap.put("daysBegin", calendar_begin.getTimeInMillis());
        calendar_end.set(Calendar.HOUR_OF_DAY, 23);
        calendar_end.set(Calendar.MINUTE, 59);
        calendar_end.set(Calendar.SECOND, 59);
        resMap.put("daysEnd", calendar_end.getTimeInMillis());
        System.out.println(getDate(calendar_begin.getTimeInMillis()));
        System.out.println(getDate(calendar_end.getTimeInMillis()));
        return resMap;
    }
// 2022-03-08 00:00:00
// 2022-03-08 23:59:59

2.7 获取当前周的开始和结束时间戳

  /**
     * @Author lbk
     * @Description // 获取当前时间所在的这个周的开始时间戳和结束时间戳
     * @Date 20:49 2022/3/8
     * @Param
     * @return
     **/
    public static Map<String, Long> getWeeksAgoAndCurrent() {
        // 初始化结果Map , 用于存储这周开始的时间戳和结束时间的时间戳
        Map<String, Long> resMap = new HashMap<>();
        Calendar calendar_weeksAgo = Calendar.getInstance();
        Calendar calendar_current = Calendar.getInstance();
        // 设置当前时间所在周周日的时间
        calendar_weeksAgo.set(Calendar.DAY_OF_WEEK, 1);   // 一周中的第一天是周日,第七天是周六
        calendar_weeksAgo.set(Calendar.HOUR_OF_DAY, 0);
        calendar_weeksAgo.set(Calendar.MINUTE, 0);
        calendar_weeksAgo.set(Calendar.SECOND, 0);

        resMap.put("weeksAgo", calendar_weeksAgo.getTimeInMillis());
        // 设置当前时间所在周周六的时间
        calendar_current.set(Calendar.DAY_OF_WEEK, 7);
        calendar_current.set(Calendar.HOUR_OF_DAY, 23);
        calendar_current.set(Calendar.MINUTE, 59);
        calendar_current.set(Calendar.SECOND,59);

        resMap.put("current", calendar_current.getTimeInMillis());
        System.out.println(getDate(calendar_weeksAgo.getTimeInMillis()));
        System.out.println(getDate(calendar_current.getTimeInMillis()));
        return resMap;

    }
// 2022-03-06 00:00:00
// 2022-03-12 23:59:59

2.8 获取去年这个月的开始时间和结束时间戳

  /**
     * @Author lbk
     * @Description // 获取去年这个月的开始时间和结束时间
     * @Date 21:12 2022/3/8
     * @Param
     * @return
     **/
    public static Map<String, Long> getMonthLastYear() {
        // 初始化结果map ,存放去年这个月的开始时间和结束时间
        Map<String, Long> resMap = new HashMap<>();
        Calendar lastYearEnd = Calendar.getInstance();
        Calendar lastYearStart = Calendar.getInstance();
        // 设置去年月份的开始
        lastYearStart.add(Calendar.YEAR, -1);
        lastYearStart.set(Calendar.DAY_OF_MONTH, 1);
        lastYearStart.set(Calendar.HOUR_OF_DAY, 0);
        lastYearStart.set(Calendar.MINUTE, 0);
        lastYearStart.set(Calendar.SECOND, 0);
        resMap.put("lastYearStart", lastYearStart.getTimeInMillis());

        // 设置去年月份的结束
        lastYearEnd.add(Calendar.YEAR, -1);
        lastYearEnd.set(Calendar.DAY_OF_MONTH, lastYearEnd.getActualMaximum(Calendar.DAY_OF_MONTH));
        lastYearEnd.set(Calendar.HOUR_OF_DAY,23);
        lastYearEnd.set(Calendar.MINUTE, 59);
        lastYearEnd.set(Calendar.SECOND, 59);
        System.out.println(getDate(lastYearStart.getTimeInMillis()));
        System.out.println(getDate(lastYearEnd.getTimeInMillis()));
        return resMap;

    }
// 2021-03-01 00:00:00
// 2021-03-31 23:59:59

3. Calendar 总览

3.1 Calendar 类的常用方法

static Calendar getInstance() 使用默认时区和区域设置获取日历。通过该方法生成Calendar对象。
public void set(int year,int month,int date,int hourofday,int minute,int second) 设置日历的年月日时分秒
public int get(int field) 返回给定日历字段的值。所谓字段就是年、月、日等等。
public Date getTime() 返回一个Date表示此日历的时间。Calendar-----Date
public void setTime(Date date) 使用给定的Date设置此日历的时间。Date------Calendar
abstract void add(int field,int amount) 按照日历的规则,给指定字段添加或减少时间量。
public long getTimeInMillies() 以毫秒为单位返回该日历的时间值。

3.2 Calendar 类中的常量

YEAR DAY_OF_WEEK_IN_MONTH 某月的第几周
MONTH 月(默认从0 开始,需加1) WEEK_OF_MONTH 一月的第几周
DAY_OF_MONTH 一个月的第几天,同DATE DAY_OF_YEAR 一年的第几天
DATE 日期 WEEK_OF_YEAR 一年的第几周
HOUR_OF_DAY 小时,24小时制 HOUR 小时,12 小时制
MINUTE 分钟 SECOND
posted @ 2022-03-16 21:24  李同学的跋涉  阅读(376)  评论(0)    收藏  举报