import java.text.DateFormatSymbols;
import java.text.SimpleDateFormat;
import java.util.*;
/**
写一个函数判断一个日期是否在本月之内
*/
public class DateTest {
public static void main(String[] args) {
DateTest dt = new DateTest();
GregorianCalendar now = new GregorianCalendar(); //构造一个日历对象
/*判断当前时区的第一天是否为周日*/
boolean isFirstSunday = (now.getFirstDayOfWeek() == Calendar.SUNDAY);
//System.out.println("当前时区一星期的第一天是否为周日:"+isFirstSunday);
int month = now.get(Calendar.MONTH); //month为获取当前的月
int today = now.get(Calendar.DAY_OF_MONTH); //today为获取当前的日
//System.out.println("现在是"+(month+1)+"月的第"+today+"天");
now.set(Calendar.DAY_OF_MONTH,1); //将now设置为本月1号
int week = now.get(Calendar.DAY_OF_WEEK); //获取周几,并赋值给week
//System.out.println("现在是星期"+(week-1)); //若一周第一天为星期天,则-1
int firstDayOfWeek = now.getFirstDayOfWeek(); //firstDayOfWeek为获取本地区的起始日
//System.out.println("当前区域一星期的第一天是星期日");
/*进行缩进,将日历对象的日减一,知道一个星期的第一天位置*/
int intent = 0; //记录缩进几次
while(firstDayOfWeek != week) //当当前时区一星期的第一天不等于今天时,执行以下循环
{
++intent;
//System.out.println("intent="+intent);
now.add(Calendar.DAY_OF_MONTH, -1); //当前日期提前一天
week = now.get(Calendar.DAY_OF_WEEK); //获取当前日期为星期几
//System.out.println("现在是星期"+week+"..");
}
/*打印星期缩写字符串*/
String[] weekdayNames = new DateFormatSymbols().getShortWeekdays();//输出表示星期的方式为缩写
do{
System.out.printf("%4s",weekdayNames[week]);
now.add(Calendar.DAY_OF_MONTH, 1); //日期增1移动
week = now.get(Calendar.DAY_OF_WEEK); //获取当前日期为星期几
}while(week != firstDayOfWeek);
System.out.println();
/*本月1号前的日期补位空格*/
for(int i = 0;i < intent;++i){
System.out.print(" ");
}
/*进行打印日期,当日日期后用*注释,直到d进入下一个月停止打印*/
now.set(Calendar.DAY_OF_MONTH, 1); //将now设置为本月1号
week = now.get(Calendar.DAY_OF_WEEK);
int day = now.get(Calendar.DAY_OF_MONTH);
do{
System.out.printf("%3s",day);
if(today == day){
System.out.print("*");
}else{
System.out.print(" ");
}
now.add(Calendar.DAY_OF_MONTH, 1);
week = now.get(Calendar.DAY_OF_WEEK);
day = now.get(Calendar.DAY_OF_MONTH);
if(week == firstDayOfWeek){ //weekday为星期的第一天则换行打印
System.out.println();
}
}while(month == now.get(Calendar.MONTH));
if(week != firstDayOfWeek){
System.out.println();
}
/*
* 获得用户输入
*/
System.out.println("\n"+"今天是"+(month+1)+"月"+today+"日"+"\n"+"请输入你要查询月份");
Scanner userMonth = new Scanner(System.in);
int m = userMonth.nextInt();
System.out.println("请输入你要查询日期");
Scanner userDay = new Scanner(System.in);
int d = userDay.nextInt();
/*判断用户输入日期是否正确*/
if( (m < 1 || m > 12) || (d < 1 || d > 31) ) {
System.out.println("输入的月份和日期不正确,请重新输入");
}
else {
System.out.println("你输入的日期是:"+ m +"月"+ d +"日");
/*判断用户输入日期是否属于本月*/
if((m == (month+1))&&(d <= dt.getDefaultDay())) {
System.out.println("输入的日期属于本月");
}else
System.out.println("输入的日期不是本月");
}
}
/*判断当月日期的最后一天,并转化为int类型*/
public int getDefaultDay() {
String str = "";
SimpleDateFormat sdf = new SimpleDateFormat("dd");
Calendar lastDate = Calendar.getInstance();
lastDate.set(Calendar.DATE, 1);// 设为当前月的1 号
lastDate.add(Calendar.MONTH, 1);// 加一个月,变为下月的1 号
lastDate.add(Calendar.DATE, -1);// 减去一天,变为当月最后一天
str = sdf.format(lastDate.getTime());
int num = Integer.parseInt(str);
return num;
}
}
//问题1:如果输入9月31,提示的是输入日期不是本月,但实际上9月并没有31日,应该提示输入错误
//问题2:如何一次性输入例如10.10这种格式的日期,并进行判断。判断的时候该如何判断
//问题3:发现Calendar.MONTH里,有时候得到的月份要+1,有时候就不用,是为什么?
感谢!!