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 | 秒 |

浙公网安备 33010602011771号