Calendar 工具类介绍及使用
1. 简介
Calendar 类是一个抽象类,它为特定瞬间与 YEAR、MONTH、DAY_OF—MONTH、HOUR 等日历字段之间的转换提供了一些方法,并为操作日历字段(如获得下星期的日期) 提供了一些方法。创建 Calendar 对象不能使用 new 关键字,因为 Calendar 类是一个抽象类,但是它提供了一个 getInstance() 方法来获得 Calendar类的对象。getInstance() 方法返回一个 Calendar 对象,其日历字段已由当前日期和时间初始化。
copyCalendar c = Calendar.getInstance();
2. 方法
2.1 set() 方法和add() 方法
copySimpleDateFormat 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 将时间戳转为日期数据
copy /**
* @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 将日期数据转为时间戳
copy/**
* @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 获取当月第一天和当前时间时间戳
copy /**
* @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 获取某年某月的月份的开始和结束时间戳
copy /**
* @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 获取当天的开始和结束时间戳
copy /**
* @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 获取当前周的开始和结束时间戳
copy /**
* @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 获取去年这个月的开始时间和结束时间戳
copy /**
* @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 | 秒 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人