Calendar

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值