#Java 利用Calender类制作日历,并且标注日期
文章目录
- 1.题目需求
- 2. Calender类
- java.uiti 类 Calender
- 3. 代码思路
- 1.从控制台获取一个日期。如2022-10-30
- 2.获得日历对象
- 3. 获取需要的信息
- 4. 输出日历
- 4.1 输入日历表头
- 4.2 日历内容输出
- 4. 全部代码及实现效果
1.题目需求
*需要注意的是,我们需要在指定日期后面加上一个“*”。
2. Calender类
java中自带了java.uitl.Date类,但是在JDK1.1之后,大量被Calender所取代,所以这里我们选择Calender类,其中给我们提供了很好的方法供我们使用。
我们这里利用Calender类实现日历功能。
java.uiti 类 Calender
java.lang.Object
java.util.Calendar
- 所有已实现的接口:
Serializable, Cloneable, Comparable<Calendar> - 直接已知子类:
GregorianCalendar ****
public abstract class Calendar
extends Object
implements Serializable, Cloneable, Comparable<Calendar>
Calendar
类是一个抽象类,它为特定瞬间与一组诸如 YEAR
、MONTH
、DAY_OF_MONTH
、HOUR
等 日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。瞬间可用毫秒值来表示,它是距历元(即格林威治标准时间 1970 年 1 月 1 日的 00:00:00.000,格里高利历)的偏移量。
该类还为实现包范围外的具体日历系统提供了其他字段和方法。这些字段和方法被定义为 protected
。
####我们该需求中**需要将Stirng类型的日期,变为Calender类型。**
方法如下:
Scanner sc = new Scanner(System.in);
System.out.println("请输入你想要查看的日期:(提示:请按照格式例如2019-3-7)");
String date = sc.next();
//2.获得日历对象
Calendar cal = new GregorianCalendar();//Calendar类是抽象类,所以这里使用Calendar的子类GregorianCalendar
java.sql.Date d = java.sql.Date.valueOf(date);//读入输入的日期
cal.setTime(d);//设置好Calender对象
Calendar类是抽象类,所以这里使用Calendar的子类GregorianCalendar
后续会用到这个类中的一些方法,将在后续代码中讲解。
3. 代码思路
1.从控制台获取一个日期。如2022-10-30
Scanner sc = new Scanner(System.in);
System.out.println("请输入你想要查看的日期:(提示:请按照格式例如2019-3-7)");
String date = sc.next();
2.获得日历对象
Calendar cal = new GregorianCalendar();//Calendar类是抽象类,所以这里使用Calendar的子类GregorianCalendar
java.sql.Date d = java.sql.Date.valueOf(date);//读入输入的日期
cal.setTime(d);//设置好Calender对象
Calendar类是抽象类,所以这里使用Calendar的子类GregorianCalendar
3. 获取需要的信息
制作一个日历,我们接下来需要几个信息。
【1】. 本月的最大天数
int maxDay = cal.getActualMaximum(Calendar.DATE);
【2】.本月第一天是第一行第几个
第一天从那一天开始,第一天之前的部分,全部输出为空格。
所以我们这里需要动一下脑筋,于是我想到了==把日期修改为第一天的日期(如输入日期为2022-9-21,则我们将其修改为2022-9-1)。==
cal.set(Calendar.DATE, 1);//设置日期为当月第一天
然后通过Calender自带的方法,得到第一天的位置
int num = cal.get(Calendar.DAY_OF_WEEK);//获取到第一天所在列数
(注:不过在此之前,需要将输入的日期所在号数存下来,为后续添加“*”做准备)
int nowDay = cal.get(Calendar.DATE);//保留目前的日期,为后续添加"*"做准备
4. 输出日历
4.1 输入日历表头
System.out.println("---------------------------");
System.out.println("日\t一\t二\t三\t四\t五\t六");
System.out.println("---------------------------");
4.2 日历内容输出
- 先设置一个换行的计数器
int count = 0;
- 输出空格部分
for (int i = 1; i <= num - 1; i++) {
System.out.print(" \t");
count++;
}
- 输出数字部分(到达本月最大数截止,换行,在指定日期后面假如“*”)
for (int i = 1; i <= maxDay; i++) {
if (i == nowDay) {
System.out.print(i + "*\t");//指定日期后面假如"*"
} else {
System.out.print(i + "\t");//其余日期正常输出
}
count++;
//当计数器能被7整除,换行
if (count % 7 == 0) {
System.out.println();
}
}
4. 全部代码及实现效果
package com.zby.TestCalendar;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Scanner;
/**
* @Auther:xxx
*/
public class Test2 {
public static void main(String[] args) {
//1.从控制台获取一个日期。如2022-10-30
Scanner sc = new Scanner(System.in);
System.out.println("请输入你想要查看的日期:(提示:请按照格式例如2019-3-7)");
String date = sc.next();
//2.获得日历对象
Calendar cal = new GregorianCalendar();//Calendar类是抽象类,所以这里使用Calendar的子类GregorianCalendar
java.sql.Date d = java.sql.Date.valueOf(date);//读入输入的日期
cal.setTime(d);//设置好Calender对象
//3.获取需要的信息
/* 制作一个日历,我们接下来需要几个信息。
【1】.本月的最大天数
【2】.本月第一天在第一行第几个
*/
//【1】.本月的最大天数
int maxDay = cal.getActualMaximum(Calendar.DATE);
//【2】.本月第一天在第一行第几个
/* Calender中自带查询日期所在位置的功能,
所以我们先需要将日期设置为本月的第一天。
然后便可获得日期。
*/
// System.out.println(cal.get(Calendar.DATE));
int nowDay = cal.get(Calendar.DATE);//保留目前的日期,为后续添加"*"做准备
cal.set(Calendar.DATE, 1);//设置日期为当月第一天
int num = cal.get(Calendar.DAY_OF_WEEK);//获取到第一天所在列数
// System.out.println("num = "+ num);
//4.制作日历
//输出日历表头
System.out.println("---------------------------");
System.out.println("日\t一\t二\t三\t四\t五\t六");
System.out.println("---------------------------");
//日历输出
int count = 0;
for (int i = 1; i <= num - 1; i++) {
System.out.print(" \t");
count++;
}
for (int i = 1; i <= maxDay; i++) {
if (i == nowDay) {
System.out.print(i + "*\t");//指定日期后面假如"*"
} else {
System.out.print(i + "\t");//其余日期正常输出
}
count++;
//当计数器能被7整除,换行
if (count % 7 == 0) {
System.out.println();
}
}
}
}
结果展示: