Java官方推荐使用Calendar来替换Date的使用。
Calendar
与 Date 之间可以自由的进行转换,转换的纽带是getTime、setTime。
//Calendar--->Date
Calendar c = Calendar.getInstance();
Date d = c.getTime();
//Date--->Calendar
Date d1 = new Date();
Calendar c1 = Calendar.getInstance();
c1.setTime(d1);
Calendar:它为特定瞬间与一组诸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等日历字段之间的转换提供了一些方法,并为操作日历字段提供了一些方法。
- 初始化
- public Calendar
getInstance()
:生成一个 Calendar 对象。
- public Calendar
- 获取功能
- public int
get(int field)
:返回给定日历字段的值。日历类中的每个日历字段都是静态的成员变量,并且是 int 类型。
- public int
- 增减功能
- public void
add(int field,int amount)
:根据给定的日历字段和对应的时间,对当前的日历字段值进行增减操作。
- public void
- 设置功能
- public final void
set(int year,int month,int date)
:设置当前日历的年月日
- public final void
field字段的值 | 含义 |
---|---|
YEAR | 年 |
MONTH | 月份。 注意:这里显示的月份是由0开始的 |
DATE | 一个月中的某天 |
DAY_OF_MONTH | 一个月中的某天 |
HOUR | 上午或下午的小时 |
HOUR_OF_DAY | 一天中的小时 |
MINUTE | 一小时中的分钟 |
SECOND | 一分钟中的秒 |
MILLISECOND | 一秒中的毫秒 |
DAY_OF_WEEK | 一个星期中的某天 |
DAY_OF_WEEK_IN_MONTH | 当前月中的第几个星期 |
DAY_OF_YEAR | 当前年中的天数 |
WEEK_OF_MONTH | 当前月中的星期数,注意:默认周日是星期的第一天,需要设置周一是第一天。 |
WEEK_OF_YEAR | 当前年中的星期数 |
public class CalendarDemo {
public static void main(String[] args) {
// 获取当前的日历时间
Calendar c = Calendar.getInstance();
// 获取年
int year = c.get(Calendar.YEAR);
// 获取月
int month = c.get(Calendar.MONTH);
// 获取日
int date = c.get(Calendar.DATE);
System.out.println(year + "年" + (month + 1) + "月" + date + "日");
// 三年前的今天
c.add(Calendar.YEAR, -3);
System.out.println(c.get(Calendar.YEAR) + "年" + (c.get(Calendar.MONTH) + 1) + "月" + c.get(Calendar.DATE) + "日");
// 5年后的10天前
c.add(Calendar.YEAR, 5);
c.add(Calendar.DATE, -10);
System.out.println(c.get(Calendar.YEAR) + "年" + (c.get(Calendar.MONTH) + 1) + "月" + c.get(Calendar.DATE) + "日");
// 月份、日期都可以大于12 31
c.add(Calendar.MONTH, 10);
c.add(Calendar.DATE,40);
System.out.println(c.get(Calendar.YEAR) + "年" + (c.get(Calendar.MONTH) + 1) + "月" + c.get(Calendar.DATE) + "日");
System.out.println("--------------");
c.set(Calendar.YEAR, 2021);
System.out.println(c.get(Calendar.YEAR) + "年" + (c.get(Calendar.MONTH) + 1) + "月" + c.get(Calendar.DATE) + "日");
c.set(2021,3,20);
System.out.println(c.get(Calendar.YEAR) + "年" + (c.get(Calendar.MONTH) + 1) + "月" + c.get(Calendar.DATE) + "日");
}
}
输出:
2021年4月20日
2018年4月20日
2023年4月10日
2024年3月21日
--------------
2021年3月21日
2021年4月20日
增减操作中,比如,当前月份是4月,执行c.add(Calendar.MONTH, 10)
后,月份为14,大于11,会 顺延 到下个年度的2月。日期也是同理。
Calendar怎么按时间格式输出?
public static void main(String[] args) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
Calendar calendar = Calendar.getInstance();
System.out.println(simpleDateFormat.format(calendar.getTime()));
}
输出:
2022-05-01 11:24:12
Calendar.getInstance() 获取当前时间,getTime() 方法获取当前时间的 Date 对象,然后再 SimpleDateFormat.format() 转换。
面试题:获取任意一年的二月有多少天
public class CalendarDemo {
public static void main(String[] args) {
// 键盘录入任意的年份
Scanner sc = new Scanner(System.in);
System.out.println("请输入年份:");
int year = sc.nextInt();
// 设置日历对象的年月日
Calendar c = Calendar.getInstance();
c.set(year, 2, 1); // 其实是这一年的3月1日
// 把时间往前推一天,就是2月的最后一天
c.add(Calendar.DATE, -1);
// 获取这一天输出即可
System.out.println(c.get(Calendar.DATE));
}
}
输出:
请输入年份:
2021
28
思路:设置日历对象为任意年份的3月1号,然后把时间往前推一天,就是2月的最后一天。获取该日历对象的日期即可。
获取日期所在的周?
public class Test4 {
public static void main(String[] args) throws ParseException {
System.out.println(getWeekByDate("2023-01-01"));
System.out.println(getWeekByDate("2023-01-02"));
System.out.println(getWeekByDate("2023-10-17"));
}
public static int getWeekByDate(String date) throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date parse = sdf.parse(date);
Calendar calendar = Calendar.getInstance();
calendar.clear();
//设置一周的第一天是星期一
calendar.setFirstDayOfWeek(Calendar.MONDAY);
//设置时间
calendar.setTime(parse);
return calendar.get(Calendar.WEEK_OF_YEAR);
}
}
输出:
1
2
43
⚠️注:⚠️需要设置一周的第一天是星期一,calendar.setFirstDayOfWeek(Calendar.MONDAY);
获取周所在的日期区间?
public class Test4 {
public static void main(String[] args) throws ParseException {
System.out.println(getWeekList(1));
System.out.println(getWeekList(2));
System.out.println(getWeekList(43));
}
public static String getWeekList(int week) {
//获取当前年月日
Calendar calendar = Calendar.getInstance(Locale.CHINA);
int year = calendar.get(Calendar.YEAR);
Calendar cal = Calendar.getInstance();
cal.clear();
//设置年份
cal.set(Calendar.YEAR, year);
//设置一周的第一天是星期一
cal.setFirstDayOfWeek(Calendar.MONDAY);
//设置周
cal.set(Calendar.WEEK_OF_YEAR, week);
//周一
cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
//格式化日期
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String start = sdf.format(cal.getTime());
//本周最后一天
cal.add(Calendar.DATE, 6);
//格式化日期
String end = sdf.format(cal.getTime());
return start + " - " + end;
}
}
输出:
2022-12-26 - 2023-01-01
2023-01-02 - 2023-01-08
2023-10-16 - 2023-10-22