Java中Calendar基本使用

Java中Calendar基本使用


Calendar中的常用日历字段

日历字段Value
YEAR当前年份
MONTH当前月份( 注:初始值是从0开始,所以得到的比实际月份小1月)
DATE一个月中的某天
WEEK_OF_YEAR当前年中的第几个星期
WEEK_OF_MONTH当前月中的第几个星期
DAY_OF_MONTH一个月中的第几天
DAY_OF_YEAR一年中的第几天
DAY_OF_WEEK一个星期中的第几天
DAY_OF_WEEK_IN_MONTH当前月中的第几个星期(注:当前月第1-7天是第一个星期,8-14是第二个星期,以此类推)
HOUR_OF_DAY一天中的第几个小时
MINUTE一小时中的第几分钟
SECOND一分钟中的第几秒
MILLISECOND一秒中的第几毫秒
public static void main(String[] args) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
        System.out.println("当前时间是:" + sdf.format(new Date()));
        Calendar ca = Calendar.getInstance();
        System.out.println("当前年份:" + ca.get(Calendar.YEAR));
        System.out.println("当前月:" + ca.get(Calendar.MONTH));// 初始月份是从0开始,所以输出值比是几月份小1
        System.out.println("当前日期:" + ca.get(Calendar.DATE));
        System.out.println("当前年份第几个星期:" + ca.get(Calendar.WEEK_OF_YEAR));
        System.out.println("当前月份第几个星期:" + ca.get(Calendar.WEEK_OF_MONTH));
        System.out.println("当前年份第几天:" + ca.get(Calendar.DAY_OF_YEAR));
        System.out.println("当前月份第几天:" + ca.get(Calendar.DAY_OF_MONTH));
        System.out.println("当前星期第几天:" + ca.get(Calendar.DAY_OF_WEEK));
        System.out.println("当前月份第几个星期:" + ca.get(Calendar.DAY_OF_WEEK_IN_MONTH));
        System.out.println("当天第几个小时:" + ca.get(Calendar.HOUR_OF_DAY));
        System.out.println("当前小时第几分钟:" + ca.get(Calendar.MINUTE));
        System.out.println("当前分钟第几秒:" + ca.get(Calendar.SECOND));
        System.out.println("当前秒数第几毫秒:" + ca.get(Calendar.MILLISECOND));
    }
当前时间是:2021-09-20 15:48:17:702
当前年份:2021
当前月:8
当前日期:20
当前年份第几个星期:39
当前月份第几个星期:4
当前年份第几天:263
当前月份第几天:20
当前星期第几天:2
当前月份第几个星期:3
当天第几个小时:15
当前小时第几分钟:48
当前分钟第几秒:17
当前秒数第几毫秒:703

更改日历字段方法: set()、 add() 和 roll()

set(oldValue, newValue)

set(oldValue, newValue) 将日历字段oldValue 更改为 newValue。此外,它设置了一个内部成员变量,以表示日历字段oldValue 已经被更改。即使日历字段oldValue 是立即被更改的,但是直到下次调用 get()、getTime()、getTimeInMillis()、add() 或 roll() 时才会重新计算日历的时间值(以毫秒为单位)。因此,多次调用 set() 不会触发多次不必要的计算。使用 set() 更改日历字段的结果是,其他日历字段也可能发生更改,这取决于日历字段、日历字段值和日历系统。此外,在重新计算日历字段之后,get(f) 没必要通过调用 set 方法返回 value 集合。具体细节是通过具体的日历类确定的。

public static void main(String[] args) {
        try {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
            System.out.println("当前时间是:" + sdf.format(new Date()));
            Calendar ca = Calendar.getInstance();
            //修改日历的指定时间
            ca.setTime(sdf.parse("2021-09-20 16:01:01:100"));
            System.out.println("修改日期后的日历时间是:" +  sdf.format(ca.getTime()));
            ca.set(Calendar.MONTH,Calendar.JANUARY);
            System.out.println("修改月份后的日历时间是:" + sdf.format(ca.getTime()));
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }
当前时间是:2021-09-20 16:19:46:535
修改日期后的日历时间是:2021-09-20 16:01:01:100
修改月份后的日历时间是:2021-01-20 16:01:01:100

add(f, delta)

add(f, delta) 将 delta 添加到 f 字段中。等同于调用 set(f, get(f) + delta),但要带以下两个调整:

Add 规则 1。调用后 f 字段的值减去调用前 f 字段的值等于 delta,以字段 f 中发生的任何溢出为模。溢出发生在字段值超出其范围时,结果,下一个更大的字段会递增或递减,并将字段值调整回其范围内。

Add 规则 2。如果期望某一个更小的字段是不变的,但让它等于以前的值是不可能的,因为在字段 f 发生更改之后,或者在出现其他约束之后,比如时区偏移量发生更改,它的最大值和最小值也在发生更改,然后它的值被调整为尽量接近于所期望的值。更小的字段表示一个更小的时间单元。HOUR 是一个比 DAY_OF_MONTH 小的字段。对于不期望是不变字段的更小字段,无需进行任何调整。日历系统会确定期望不变的那些字段。

此外,与 set() 不同,add() 强迫日历系统立即重新计算日历的毫秒数和所有字段。

示例:假定 GregorianCalendar 最初被设置为 1999 年 8 月 31 日。调用 add(Calendar.MONTH, 13) 将日历设置为 2000 年 9 月 30 日。Add 规则 1 将 MONTH 字段设置为 September,因为向 August 添加 13 个月得出的就是下一年的 September。因为在 GregorianCalendar 中,DAY_OF_MONTH 不可能是 9 月 31 日,所以 add 规则 2 将 DAY_OF_MONTH 设置为 30,即最可能的值。尽管它是一个更小的字段,但不能根据规则 2 调整 DAY_OF_WEEK,因为在 GregorianCalendar 中的月份发生变化时,该值也需要发生变化。

public static void main(String[] args) {
        try {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
            System.out.println("当前时间是:" + sdf.format(new Date()));
            Calendar ca = Calendar.getInstance();
            //修改日历的指定时间
            ca.setTime(sdf.parse("2021-10-31 16:01:01:100"));
            System.out.println("修改日期后的日历时间是:" +  sdf.format(ca.getTime()));
            ca.add(Calendar.MONTH,1);
            System.out.println("修改月份后的日历时间是:" + sdf.format(ca.getTime()));
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }
当前时间是:2021-09-20 16:28:33:741
修改日期后的日历时间是:2021-10-31 16:01:01:100
修改月份后的日历时间是:2021-11-30 16:01:01:100

roll(f, delta)

roll(f, delta) 将 delta 添加到 f 字段中,但不更改更大的字段。这等同于调用 add(f, delta),但要带以下调整:

Roll 规则。在完成调用后,更大的字段无变化。更大的字段表示一个更大的时间单元。DAY_OF_MONTH 是一个比 HOUR 大的字段。

public static void main(String[] args) {
        try {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
            System.out.println("当前时间是:" + sdf.format(new Date()));
            Calendar ca = Calendar.getInstance();
            ca.roll(Calendar.DAY_OF_MONTH,-21);
            System.out.println("修改后的日历时间是:" + sdf.format(ca.getTime()));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

9月20 往前推21天,不是到8月30,而是9月20减去20天到9月30日,9月30日减去一天到9月29日

当前时间是:2021-09-20 16:31:56:197
修改后的日历时间是:2021-09-29 16:31:56:197

Java中文api地址:https://tool.oschina.net/apidocs/apidoc?api=jdk-zh

  • 23
    点赞
  • 87
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值