日历类Calendar

Java官方推荐使用Calendar来替换Date的使用。

Calendar与 Date 之间可以自由的进行转换,转换的纽带是getTimesetTime

//Calendar--->Date
Calendar c = Calendar.getInstance();
Date d = c.getTime();

//Date--->Calendar
Date d1 = new Date();
Calendar c1 = Calendar.getInstance();
c1.setTime(d1);

Calendar:它为特定瞬间与一组诸如 YEARMONTHDAY_OF_MONTHHOUR 等日历字段之间的转换提供了一些方法,并为操作日历字段提供了一些方法。

  • 初始化
    • public Calendar getInstance():生成一个 Calendar 对象。
  • 获取功能
    • public int get(int field):返回给定日历字段的值。日历类中的每个日历字段都是静态的成员变量,并且是 int 类型。
  • 增减功能
    • public void add(int field,int amount):根据给定的日历字段和对应的时间,对当前的日历字段值进行增减操作
  • 设置功能
    • public final void set(int year,int month,int date):设置当前日历的年月日
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) + "日");
    }
}

输出:
2021420201842020234102024321--------------
20213212021420

增减操作中,比如,当前月份是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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

不会叫的狼

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

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

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

打赏作者

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

抵扣说明:

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

余额充值