Calendar定义
Calendar 中文的翻译就是日历,那我们立刻可以想到我们生活中有阳(公)历、阴(农)历之分。它们的区别在哪呢?
比如有:
月份的定义 - 阳`(公)历 一年12 个月,每个月的天数各不同;阴(农)历,每个月固定28天
每周的第一天 - 阳(公)历星期日是第一天;阴(农)历,星期一是第一天。
实际上,在历史上有着许多种纪元的方法。它们的差异实在太大了,比如说一个人的生日是"八月八日" 那么一种可能是阳(公)历的八月八日,但也可以是阴(农)历的日期。所以为了计时的统一,必需指定一个日历的选择。那现在最为普及和通用的日历就是 “Gregorian Calendar”。也就是我们在讲述年份时常用 “公元几几年”。Calendar 抽象类定义了足够的方法,让我们能够表述日历的规则。Java 本身提供了对 “Gregorian Calendar” 规则的实现。我们从 Calendar.getInstance() 中所获得的实例就是一个 “GreogrianCalendar” 对象(与您通过 new GregorianCalendar() 获得的结果一致)。
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance();
if(calendar instanceof GregorianCalendar) {
System.out.println("√");
}
}
Calendar 在 Java 中是一个抽象类(Abstract Class),GregorianCalendar 是它的一个具体实现。
我们也可以自己的 Calendar 实现类,然后将它作为 Calendar 对象返回(面向对象的特性)。在 IBM alphaWorks 上,IBM 的开发人员实现了多种日历(Legacy Communities - IBM Community)。同样在 Internet 上,也有对中国农历的实现。本文对如何扩展 Calendar 不作讨论,大家可以通过察看上述 Calendar 的源码来学习。
Calendar与Date转化
非常简单
// 获取Calendar实例(使用默认时区和语言环境获得一个日历)
Calendar calendar = Calendar.getInstance();
// Calendar转Date
Date date = calendar.getTime();
// Date对象反映到 Calendar 对象中
Date date = new Date();
calender.setTime(date);
几个注意点:
(1)月份的起始值为0,而不是1,一般设置月份时会加+1,或者比当前小一个月。
类变量
1. YEAR
这个字段含义时年份,假如说现在是2022-02-14,那么执行:
System.out.println(calendar.get(Calendar.YEAR));
就是:2022
2. MONTH
月份。
3. WEEK_OF_YEAR
一年当中的第几天。
4. DAY_OF_MONTH
一个月当中的第几天。
5. DAY_OF_WEEK
一个周当中的第几天。
6. MONTH
月份。
7. DAY_OF_WEEK_IN_MONTH
当前天是一个月中的第几个周。
System.out.println(calendar.get(Calendar.DAY_OF_WEEK_IN_MONTH));
输出:2,意思:当前是天在一个月中是第二个周。
8. WEEK_MONTH
当前周在这个月中是第几个周。
9. AM_PM
当前是 AM - 上午 还是 PM - 下午,返回0标示是AM,返回1表示PM 。
10. WEEK_MONTH
当前周在这个月中是第几个周。
11. HOUR
显示当前时间,12小时制。
// 这里有个疑问:如果用HOUR, 下午的3点和凌晨的3点如何判断?
System.out.println(calendar.get(Calendar.HOUR)); // 3
// 可以先判断AM 或 PM,然后在判输出Calendar.HOUR
12. HOUR_OF_DAY
显示当前时间,24小时制。
System.out.println(calendar.get(Calendar.HOUR_OF_DAY)); // 15
13. MINUTE
显示当前分钟数。
14. SECOND
显示当前时间的秒数。
15. MILLISECOND
显示当前时间的毫秒数。
常用API
1. add()
add 功能非常强大,对Calendar字段进行计算。
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance();
// 当前月份 + 两个月
calendar.add(Calendar.MONTH, +2);
// calendar.add(Calendar.MONTH, 2); 不写加号效果一样
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
System.out.println(simpleDateFormat.format(calendar.getTime()));
}
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance();
// 当前月份 - 12
calendar.add(Calendar.MONTH, -12);
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
System.out.println(simpleDateFormat.format(calendar.getTime()));
}
2. get()
获取当前的 年-月-日 时:分:秒, 该功能与Date对象中的date.getMoth() date.getDay() ··· ··· 一样。
@Slf4j
public class Test {
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance();
// 获取当前的年
System.out.println("当前的年:" + calendar.get(Calendar.YEAR));
// 获取当前的月
System.out.println("当前的月:" + (calendar.get(Calendar.MONTH) + 1));
// 获取当前的日
System.out.println("当前的日:" + calendar.get(Calendar.DAY_OF_MONTH));
// 获取当前的时
System.out.println("当前的时:" + calendar.get(Calendar.HOUR_OF_DAY));
// 获取当前的分钟
System.out.println("当前的分:" +calendar.get(Calendar.MINUTE));
// 获取当前的秒
System.out.println("当前的秒:" +calendar.get(Calendar.SECOND));
// 获取当前的毫秒
System.out.println("当前的毫秒:" +calendar.get(Calendar.MILLISECOND));
// 获取当前完整的年月日时分秒毫秒
log.info("当前的时间为: {}-{}-{} {}:{}:{}:{}",
calendar.get(Calendar.YEAR),
calendar.get(Calendar.MONTH)+1,
calendar.get(Calendar.DAY_OF_MONTH),
calendar.get(Calendar.HOUR_OF_DAY),
calendar.get(Calendar.MINUTE),
calendar.get(Calendar.SECOND),
calendar.get(Calendar.MILLISECOND));
}
}
GregorianCalendar类
它是继承Calendar。
常用api
GregorianCalendar gregorianCalendar = new GregorianCalendar();
1. isLeapYear(int year)
判断年份是否是闰年。
System.out.println(gregorianCalendar.isLeapYear(2022)); // false