新手做日历时的一个问题
上面这些代码。在输入每一年的1月或者2月的时候 生成的日历就是错的 而输入别的月份应该都是对的 我是初学者 实在找不出来错误了 希望各位看一下告诉我 。 谢谢了!
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Calendar;
import java.util.Scanner;
public class wenjian
{
public static void main(String args[])
{
int nian=0;
int yue=0;
Scanner dedao=new Scanner(System.in);
System.out.print( "请输入年: ");
nian=dedao.nextInt();
System.out.print( "请输入月: ");
yue=dedao.nextInt();
if (nian <0 || yue <0 || yue> 12)
System.out.println( "请输入正确的信息! ");
else
{
shijian a=new shijian(nian,yue);
a.shezhiriqi();
a.dedaoxingqi();
a.jisuanxingqi();
a.xianshi();
}
}
}
class shijian
{
//声明成员
private int nian; //保存年
private int yue; //保存月
private String xingqi; //得到日期字符串
private int shuzi = 0; //把日期转换成数字后保存到这里
private int runnian = 0; //判断闰年
//声明对象
Date riqi = null;
Calendar setriqi = Calendar.getInstance();
SimpleDateFormat format = new SimpleDateFormat( "E ");
//以下是构造方法
public shijian(int nian, int yue) {
this.nian = nian;
this.yue = yue;
if (nian % 4 == 0 && nian % 100 != 0) //判断闰年代码块
runnian = 1;
else if (nian % 100 == 0 && nian % 400 == 0)
runnian = 1;
}
void shezhiriqi() { //把用户输入的年月设置为setriqi对象里的一部分
setriqi.set(Calendar.YEAR, nian);
setriqi.set(Calendar.MONTH, yue + 1);
riqi = setriqi.getTime(); //把设置后的时间生成一个Date对象返回给riqi引用
}
void dedaoxingqi() { // 输入riqi里的星期,把星期值赋给字符串xingqi
xingqi = format.format(riqi);
}
void jisuanxingqi() { //对xingqi的值进行检测
if (xingqi.equals( "星期一 "))
shuzi = 1;
else if (xingqi.equals( "星期二 "))
shuzi = 2;
else if (xingqi.equals( "星期三 "))
shuzi = 3;
else if (xingqi.equals( "星期四 "))
shuzi = 4;
else if (xingqi.equals( "星期五 "))
shuzi = 5;
else if (xingqi.equals( "星期六 "))
shuzi = 6;
else if (xingqi.equals( "星期日 "))
shuzi = 0;
}
void xianshi() {
int tianshu; //检测用户输入的月份有多少天
switch (yue) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
tianshu = 31;
break;
default:
tianshu = 30;
}
if (runnian == 1 && yue == 2) //如果是闰年而且月份是2月
tianshu = 29; //tianshu就是29
else if (runnian != 1 && yue == 2)
tianshu = 28; //如果不是闰年不过月份是2月 那tianshu就是28
System.out.println( "\t\t\t\t " + nian + "\t " + yue + "\n "); //输出
System.out.println( "\t日\t一\t二\t三\t四\t五\t六 ");
for (int i = 0; i < shuzi; i++) { //输出tab 为了对齐
System.out.print( "\t ");
}
for (int i = 1; i <= tianshu; i++, shuzi++) {
if (shuzi == 7) { //把值循环输出
System.out.print( "\n ");
shuzi = 0;
}
System.out.print( "\t " + i);
}
}
}
[解决办法]
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Calendar;
import java.util.Scanner;
public class wenjian
{
public static void main(String args[])
{
int nian=0;
int yue=0;
Scanner dedao=new Scanner(System.in);
System.out.print( "请输入年: ");
nian=dedao.nextInt();
System.out.print( "请输入月: ");
yue=dedao.nextInt();
if (nian <0 || yue <0 || yue> 12)
System.out.println( "请输入正确的信息! ");
else
{
shijian a=new shijian(nian,yue);
a.shezhiriqi();
a.dedaoxingqi();
a.jisuanxingqi();
a.xianshi();
}
}
}
class shijian
{
//声明成员
private int nian; //保存年
private int yue; //保存月
private String xingqi; //得到日期字符串
private int shuzi = 0; //把日期转换成数字后保存到这里
private int runnian = 0; //判断闰年
//声明对象
Date riqi = null;
Calendar setriqi = Calendar.getInstance();
SimpleDateFormat format = new SimpleDateFormat( "E ");
//以下是构造方法
public shijian(int nian, int yue) {
this.nian = nian;
this.yue = yue;
if (nian % 4 == 0 && nian % 100 != 0) //判断闰年代码块
runnian = 1;
else if (nian % 100 == 0 && nian % 400 == 0)
runnian = 1;
}
void shezhiriqi() { //把用户输入的年月设置为setriqi对象里的一部分
setriqi.set(Calendar.YEAR, nian);
setriqi.set(Calendar.MONTH, yue - 1);
setriqi.set(Calendar.DAY_OF_MONTH, 1);
riqi = setriqi.getTime(); //把设置后的时间生成一个Date对象返回给riqi引用
}
void dedaoxingqi() { // 输入riqi里的星期,把星期值赋给字符串xingqi
xingqi = format.format(riqi);
System.out.println( "xingqi: "+xingqi);
}
void jisuanxingqi() { //对xingqi的值进行检测
if (xingqi.equals( "星期一 "))
shuzi = 1;
else if (xingqi.equals( "星期二 "))
shuzi = 2;
else if (xingqi.equals( "星期三 "))
shuzi = 3;
else if (xingqi.equals( "星期四 "))
shuzi = 4;
else if (xingqi.equals( "星期五 "))
shuzi = 5;
else if (xingqi.equals( "星期六 "))
shuzi = 6;
else if (xingqi.equals( "星期日 "))
shuzi = 0;
}
void xianshi() {
int tianshu; //检测用户输入的月份有多少天
switch (yue) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
tianshu = 31;
break;
default:
tianshu = 30;
}
if (runnian == 1 && yue == 2) //如果是闰年而且月份是2月
tianshu = 29; //tianshu就是29
else if (runnian != 1 && yue == 2)
tianshu = 28; //如果不是闰年不过月份是2月 那tianshu就是28
System.out.println( "\t\t\t\t " + nian + "\t " + yue + "\n "); //输出
System.out.println( "\t日\t一\t二\t三\t四\t五\t六 ");
for (int i = 0; i < shuzi; i++) { //输出tab 为了对齐
System.out.print( "\t ");
}
for (int i = 1; i <= tianshu; i++, shuzi++) {
if (shuzi == 7) { //把值循环输出
System.out.print( "\n ");
shuzi = 0;
}
System.out.print( "\t " + i);
}
}
}
[解决办法]
两个错误
1、设置月的时候应该是setriqi.set(Calendar.MONTH, yue - 1);
2. 取日期的时候日期应该设置为1,否则认为是执行当天的日期,那样取出来当然不对
也就是
setriqi.set(Calendar.MONTH, yue - 1);
setriqi.set(Calendar.DATE, 1);