上面这些代码。在输入每一年的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);
        }
    }
}

解决方案 »

  1.   

    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就是28System.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);
    }
    }
    }
      

  2.   

    setriqi.set(Calendar.YEAR, nian);
    setriqi.set(Calendar.MONTH, yue + 1);这里你要加一句
    setriqi.set(Calendar.DAY_OF_MONTH, 1);把日期设置成一号,否则是今天的日期24号,这样得到的星期肯定不是你想要的,另外
    setriqi.set(Calendar.MONTH, yue + 1);要改为:
    setriqi.set(Calendar.MONTH, yue - 1);
    因为Calendar的MONTH是从0开始计数的,比如你在程序运行的是输入1,希望它显示一月份的日期,但是如果你不减一,那么将显示二月份的日期,更没有道理加一了。
      

  3.   

    两个错误
    1、设置月的时候应该是setriqi.set(Calendar.MONTH, yue - 1);
    2. 取日期的时候日期应该设置为1,否则认为是执行当天的日期,那样取出来当然不对
    也就是
    setriqi.set(Calendar.MONTH, yue - 1);
    setriqi.set(Calendar.DATE, 1);
      

  4.   

    呃  我以为SimpleDateFormat("E"); 是返回这个月1号是星期几的 
    原来是返回今天是星期几的。  汗谢谢啦!