要求
话不多说,上代码
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Scanner;
public class Test {
public static void main(String[] args) throws ParseException {
System.out.println("请输入日期:(年月日,格式:2008-9-20)");
//自定义日期格式
SimpleDateFormat s1 = new SimpleDateFormat("yyyy-MM-dd");
//键盘输入
Scanner scanner = new Scanner(System.in);
String str = scanner.next();
//将输入的字符串转换成日期
Date d1 = s1.parse(str);
//将Date放入Calendar中,我们知道java的元年是1900年
/*GregorianCalendar calendar = new GregorianCalendar(d1.getYear() + 1900,d1.getMonth(),d1.getDate());*/
GregorianCalendar calendar = new GregorianCalendar();
calendar.setTime(d1);
//获取今天是本月第几天
int day = calendar.get(Calendar.DAY_OF_MONTH);
//因为要知道本月第一天是周几,所以需要先设置为本月第一天
calendar.set(Calendar.DATE,1);
//获取本月第一天是周几
int weekInitial = calendar.get(Calendar.DAY_OF_WEEK);
//判断本月有多少天 写法1
int dayLast = calendar.getActualMaximum(Calendar.DATE);
/*
//判断本月有多少天 写法2
int month = calendar.get(Calendar.MONTH);//获取是第几月
int year = calendar.get(Calendar.YEAR);//获取本年
int dayLast;
if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 ||
month == 12){
dayLast = 31;
}else if (month == 2){
//判断平年闰年
if ((year % 4 == 0 && year % 100 == 0) || year % 400 == 0){
dayLast = 29;
}else{
dayLast = 28;}
}else{
dayLast = 30;}
*/
System.out.println("日\t一\t二\t三\t四\t五\t六\t");
//打印本月1号前的空格
for (int i = 1;i < weekInitial;i++){
System.out.print("\t");
}
//打印日期
for (int i = 1;i <= dayLast;i++){
//如果是本天,则多打印一个 *
if (i == day)
{
System.out.print("*" + i +"\t");}
else {
System.out.print(i + "\t");}
//判断遍历时,是周几
int week2 = calendar.get(Calendar.DAY_OF_WEEK);//如果是周六。返回7
if (week2 == 7){
System.out.println();
}
//最后一定要记得天数自增
calendar.add(Calendar.DAY_OF_MONTH,1);
}
}
}
遇到的问题
- 问题一
由于自己刚刚学完时间类,学艺不精,自己创造GregorianCalendar
时,用的是代码中注释的语句。
而且自己的第一次写的是GregorianCalendar calendar = new GregorianCalendar(d1.getYear() + 1900,d1.getMonth() + 1,d1.getDate());
这里暴露出巨大的问题,因为Java中从二月算是一,自己就想着来个加一就是我们中国的计算法,却忘记了后面的操作的月份还是根据Java中的规矩,自己如果盲目加一,后面就是9月,无论怎么输入,都是不正确的。 - 问题二
自己学艺不精,在确定本月有多少天时,用了最笨的方法。
其实可以用int dayLast = calendar.getActualMaximum(Calendar.DATE);
直接找出 - 问题三
在日期遍历时,注意一定要用calendar进行遍历,只有这样才能判断周几,选择在周六时换行
最后,注意的事项
一定要注意Java中,从1999年1月1日00:00:00算起,二月为第一个,周日为第一个
在运算时,先不要对其进行修改,若要打印出来,再进行修改,变成我们熟知的样式
本文是自己完成尚学堂作业时,自己的拙见,如有问题,欢迎指教
# 第二次编辑 认识到前面自己的解释有问题,注释中的中的代码不要用。因为虽然`int month = calendar.get(Calendar.MONTH);`,打印的是自己输入的日期月份,但是在设置本月第一天`calendar.set(Calendar.DATE,1);`,代码设置的是按Java中的第几月。如自己输入的是10月,打印出来也是10月,但是在设置本月第一天时,系统认为是设置Java中的10月的第一天(也就是我们的11月1号),所以在后面的`int weekInitial = calendar.get(Calendar.DAY_OF_WEEK);`,获取本月第一天是周几时,系统会判断的是我们的11月1号是周几