学习-Java常用类之Calendar类(3)

任务描述

本关任务:获取给定年月的最后一天。

相关知识

我们通过之前的学习已经能够格式化并创建一个日期对象了,但是我们如何才能设置和获取日期数据的特定部分呢,比如说小时,日,或者分钟? 我们又如何在日期的这些部分加上或者减去值呢?

calendar 类是一个抽象类,是 Java 日期处理的核心类之一。Calendar 类为操作日历字段,及其与特定瞬间之间的转换提供了方法。日历字段包含 YEAR、MONTH、DAY_OF_MONTH、HOUR 等,它们都是 Calendar 类的静态常量。

首先我们来看该类的声明:

 
  1. public abstract class Calendar extends Object implements Serializable, Cloneable, Comparable<Calendar>

由于该类的修饰符是 protected,所以无法直接创建该对象。需要通过别的途径生成该对象。不过 Calendar 类提供了一个类方法 getInstance() 来返回 Calendar 的实例(该对象为 Calendar 的子类对象),其日历字段已由当前日期和时间初始化。代码所示如下:

 
  1. Calendar calendar = Calendar.getInstance(); // 使用默认时区和语言环境获得一个日历

接下来我们看 Calendar 的一些常用字段,见下表。

常量描述
Calendar.YEAR年份
Calendar.MONTH月份
Calendar.DATE日期
Calendar.DAY_OF_MONTH日期,和上面的字段意义完全相同
Calendar.HOUR12 小时制的小时
Calendar.HOUR_OF_DAY24 小时制的小时
Calendar.MINUTE分钟
Calendar.SECOND
Calendar.DAY_OF_WEEK星期几
Calendar.AM上午
Calendar.PM下午

接着我们来看 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 void setTime(Date date)使用给定的 Date 设置此日历的时间。
public Date getTime()返回一个 Date 表示此日历的时间。
abstract void add(int field,int amount)按照日历的规则,给指定字段添加或减少时间量。
public long getTimeInMillis()以毫秒为单位返回该日历的时间值。
getActualMaximum()方法返回基于此 Calendar 的时间值,指定日历字段可能拥有的最大值。

例子:

  • set(int year,int month,int date,int hourofday,int minute,int second):设置日历的年、月、日、时、分、秒;

     
      
    1. Calendar calendar = Calendar.getInstance();
    2. calendar.set(2020,1,1); // 设置当前时间为 2020年02月01日

    注意:月份的下标是从 0 开始的,即 011 分别代表 112 月。

  • int get(int field):返回给定日历字段的值;

     
      
    1. Calendar calendar = Calendar.getInstance();
    2. int year = calendar.get(Calendar.YEAR);
    3. System.out.println(year);

    执行结果:

     
      
    1. 2020
  • setTime(Date date):使用给定的 Date 设置此日历的时间;

     
      
    1. Calendar calendar = Calendar.getInstance();
    2. Date d = new Date(1580538917000L);
    3. calendar.setTime(d); // 使用给定的 Date 设置此日历的时间
  • Date getTime():返回一个 Date 表示此日历的时间;

     
      
    1. Calendar calendar = Calendar.getInstance();
    2. Date d = new Date(1580538917000L);
    3. calendar.setTime(d); // 使用给定的 Date 设置此日历的时间
    4. System.out.println(calendar.getTime());

    执行结果:

     
      
    1. Sat Feb 01 14:35:17 CST 2020
  • add(int field,int amount):按照日历的规则,给指定字段添加或减少时间量。

     
      
    1. Calendar calendar = Calendar.getInstance();
    2. System.out.println(calendar.getTime());
    3. // 把 calendar 对象的日期加上 10 ,也就是 calendar 也就表示为 10 天后的日期,其它所有的数值会被重新计算
    4. calendar.add(Calendar.DATE, 10);
    5. System.out.println(calendar.getTime());
    6. // 把 calendar 对象的日期减去 10 ,也就是 calendar 也就表示为 10 天前的日期,其它所有的数值会被重新计算
    7. calendar.add(Calendar.DATE, -10);
    8. System.out.println(calendar.getTime());

    执行结果:

     
      
    1. Tue Feb 18 17:45:47 CST 2020
    2. Fri Feb 28 17:45:47 CST 2020
    3. Tue Feb 18 17:45:47 CST 2020
/**
 * 获取给定年月的最后一天。
 */

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Scanner;

public class Test{
    // 请在下面的Begin-End之间按照注释中给出的提示编写正确的代码
    /********** Begin **********/

    /**
     * 该方法提供了两个参数,分别为当前的年月,
     * 计算当前年月下该月的最后一天,将最后一天的日期输出,
     * 返回类型为 String,格式为:“yyyy-MM-dd”
     */
        public static String getLastDayOfMonth(int year,int month) {
            Calendar calendar = Calendar.getInstance();
            calendar.set(Calendar.YEAR,year);
            calendar.set(Calendar.MONTH,month - 1);
            int day = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
            calendar.set(Calendar.DAY_OF_MONTH,day);
            SimpleDateFormat SDF = new SimpleDateFormat("yyyy-MM-dd");
            String str = SDF.format(calendar.getTime());
            return str;
    }
    /********** End **********/
    
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int year = scanner.nextInt();
        int month = scanner.nextInt();
        String lastDay = getLastDayOfMonth(year,month);
        System.out.print("当前月的最后一天:" + lastDay);
    }
}

 

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

摸鱼的三金

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值