A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 工善器 高级黑马   /  2013-12-2 20:20  /  1492 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

package text;
/*
*  题目:编写程序,该程序启动后用户可以按“yyyy-MM-dd”的格式输入一个日期,
*  程序计算这一天是星期几,并且计算出是一年中的第几天。
*  理解:再次审题后发现,用户是按这个要求格式输入的,这就好办了。
*  星期几,还是第几天,知道是多少天后,模7就得出星期了。
*  步骤:
*  1.读取到这个日期,提取其中的年月日。
*  2.月份乘以当月的天数加(几月)几号,可以算出总天数。
*  3,闰年也要判断一下,将二月的天数设为变量,通过闰年判断返回。
*/
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

class sumd{
    private  int year = 0;
    private int mon = 0;
    private int day = 0;
    private int md = 30;
   
   
    public int getYear() {
        return year;
    }

    public void setYear(int year) {
        this.year = year;
    }

    public int getMon() {
        return mon;
    }

    public void setMon(int mon) {
        this.mon = mon;
    }

    public int getDay() {
        return day;
    }

    public void setDay(int day) {
        this.day = day;
    }

    int sum = 0;
    String c = null;
   

    public int getSum() {
        return sum;
    }

    public void setSum(int sum) {
        this.sum = sum;
    }

    public String getC() {
        return c;
    }

    public void setC(String c) {
        this.c = this.week();
    }

    public    boolean trueday() {
        if ((mon >= 1 && mon <= 12) && (day >= 1 && day <= 31)) {
            return true;
        }
        return false;
    }

    public void sumday() {
        
//        System.out.println(this.mon+"哈哈,我找到你");//测试用
        switch (this.mon) {
        case 1:
            md = 31;
            break;
        case 2:
            this.specialyear();
            break;

        case 4:
            md = 30;
            break;

        case 6:
            md = 30;
            break;

        case 9:
            md = 30;
            break;

        case 11:
            md = 30;
            break;

        default:
            md = 31;
            break;
        }
        this.setSum((mon-1) * md + this.day);
//        比如12月,将前11月,乘以对应每月的天数,加上获取到的天数。得出总天数
//        System.out.println(md+"此时的md");//测试用
//        System.out.println(this.specialyear());//测试用
    }
    public String week() {
        int i = sum % 7;
        switch (i) {
        case 1:
            c = "一";
            break;
        case 2:
            c = "二";
            break;
        case 3:
            c = "三";
            break;
        case 4:
            c = "四";
            break;
        case 5:
            c = "五";
            break;
        case 6:
            c = "六";
            break;
        case 0:
            c = "日";
            break;

        }
        return c;
    }

    public int specialyear() {
        if (this.year % 4 == 0 && (this.year / 100 % 4 == 0))
            {
            System.out.println(this.year);//测试用
            return 29;}
        return 28;
    }

   
}

public class Text9 {   
   
   

    public static void main(String[] args) throws IOException {
        BufferedReader bufr = new BufferedReader(new InputStreamReader(
                System.in));
        // 先把这句经典的话写上,放心。
   

        String s = null;
        sumd t=new sumd();

        while ((s = bufr.readLine()) != null) {
            t.setYear( Integer.valueOf(s.substring(0, 4)));
            t.setMon( Integer.valueOf(s.substring(4, 6)));
            t.setDay(Integer.valueOf(s.substring(6, 8)));
            System.out.println(t.getDay());
            System.out.println(t.getMon());
            System.out.println(t.getYear());
            
//            把年月日取出来,写到变量里面。
            if (t.trueday()) {
                t.sumday();//总天数
//                是谁负责运算,一定要记得,不要马虎
                t.week();//星期几
                System.out.println("是这一年的:第" + t.getSum() + "天");
                System.out.println("是星期:" + t.getC());
                break;
            } else {
                System.out.println("你输入的日期有误!");
                break;
            }
        }
    }
}

评分

参与人数 1技术分 +1 黑马币 +6 收起 理由
枫儿 + 1 + 6 神马都是浮云

查看全部评分

11 个回复

倒序浏览
计算的结果老是不正确,输入20130201,计算是:这一年的31天。
回复 使用道具 举报
总是差那么两天
回复 使用道具 举报
我会告诉你,我的基础测试就有这题吗。。你的思路错了。。不多说,上代码。
  1. package com.itheima;

  2. import java.io.BufferedReader;
  3. import java.io.IOException;
  4. import java.io.InputStreamReader;
  5. import java.text.ParseException;
  6. import java.text.SimpleDateFormat;
  7. import java.util.Calendar;
  8. import java.util.Date;
  9. import java.util.GregorianCalendar;

  10. /**
  11. *第九题: 编写程序,该程序启动后用户可以按“yyyy-MM-dd”的格式输入一个日期,程序计算这一天是星期几,并且计算出是一年中的第几天。
  12. * @author wangyang
  13. *
  14. *
  15. *思路:
  16. *1,获取键盘输入。存入字符串中。
  17. *2,因为要用到时间日期格式,所以找到DateFormat这个类,用它的子类设置日期格式。
  18. *3,调用parse方法。把字符串解析为一个Date对象。
  19. *4,因为要计算日期,所以找到Calendar这个类,调用setTime(date)方法,设置日期。
  20. *5,通过Calendar的get方法。获取所要的数据。
  21. */

  22. public class Test9 {

  23.         public static void main(String[] args) throws ParseException, IOException {
  24.                
  25.                 BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  26.                 String data = br.readLine();//获取输入的日期。
  27.                
  28.                 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");//给日期格式化。               
  29.                 Date date = sdf.parse(data);//把字符串转成日期。抛出:ParseException - 如果无法解析指定字符串的开始处。
  30.                
  31.                 GregorianCalendar c = new GregorianCalendar();
  32.                 c.setTime(date);//设置日期。
  33.                
  34.                 int week = c.get(Calendar.DAY_OF_WEEK);//获取星期中的第几天。注意:外国人星期日是第一天。
  35.                 int day = c.get(Calendar.DAY_OF_YEAR);//获取一年中第几天
  36.                
  37.                 String[] stringweek = {"","星期日","星期一","星期二","星期三","星期四","星期五","星期六"};//这样打印比较好。
  38.                 System.out.print(data+" "+stringweek[week]);
  39.                 System.out.println(" 一年中的第"+day+"天");
  40.                
  41.                 br.close();//关流。
  42.         }

  43. }

复制代码

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

回复 使用道具 举报
你的意思是对的,他可能要求这样算直接获取。dateofweek。我的这个日子的算法问题在于每一月没有对应正确累加,经过我几个小时努力搞定了。
回复 使用道具 举报
这还用查?今天星期二你知道吧?今年2008年4月29日对吧?你自己算一下:

每个平年 365 天,52*7 + 1 = 365,就是说每过一个平年,同月同日是星期几递增一天,那从公元元年1月1日到现在经过了 2007 年,增加 2007 天

而在这 1-2007 年度中,每隔四年多一个闰年多一天,共多 2007 除以 4 取整 501 天;
每隔 100 年少一个闰年,再减少 20 天;
每隔 400 年再多一个闰年,多 5 天

共 2007 + 501 - 20 + 5 这么多天
其实我们只要这个数字除以 7 的余数,就是 1

现在再算算今年过去的天数:
一月 31 天,除以 7 余 3
二月 29 天,除以 7 余 1 (今年是闰年)
三月 31 天,除以 7 余 3
四月 1 日到 29 日(今天)过去28天,余 0
合计除以 7 余 0

因此从 0001-1-1 到 2008-4-29 共经过若干星期外加 1 天,今天星期二,可见公元元年1月1日是星期一

确定历法的时候,需要考虑一些事情,比如说怎么闰年免得春分点产生累积移动什么的等等等等……但总要定一个起点吧?定这个起点就看他自己的偏好了,不管怎么说,定好了就用就行了——不过一般从【公元】元年开始,【公元】是我们对纪年方法的简称,元年表示是这种纪年方法确定的第一年。为什么不从公元前开始?还真不好说,反正绝大多数人如果确定一个历法,大概都会说,好吧,从某一天开始,这天算 1 年 1 月 1 日;没人这么办:好吧,从某一天开始,这一天算 -238 年 3 月 28 日
回复 使用道具 举报
这哥们的思路我已经实现,正在辨明真伪。整个过程还是很锻炼,我现在的日期已经完全正确,有兴趣也可以思考下这个
回复 使用道具 举报
谢谢你{:soso_e179:}
回复 使用道具 举报
HAnG 中级黑马 2013-12-2 22:17:57
9#
汪洋大海 发表于 2013-12-2 21:13
我会告诉你,我的基础测试就有这题吗。。你的思路错了。。不多说,上代码。
...

我写的跟你差不多,只是我没用格式化,直接把输入的字符串给切3段set给calendar了。
但我比你的多了2个操作,一个是正则表达式检验输入格式,一个是没有直接抛异常而是try&catch。
  1.                         while((date=bufr.readLine()) != null) {
  2.                                 if(date.matches("\\d{1,4}-\\d{1,2}-\\d{1,2}"))
  3.                                         break;
  4.                                 else {
  5.                                         System.out.println("格式错误!请重新输入:");
  6.                                         continue;
  7.                                 }
  8.                         }
复制代码
回复 使用道具 举报
HAnG 中级黑马 2013-12-2 22:23:06
10#
本帖最后由 HAnG 于 2013-12-2 22:27 编辑

对了还有2点不同,1.给日历set月份时我把月份减1了,因为java中月份用0-11表示
2.我是把整段函数都封装起来了,主函数只负责调用。
回复 使用道具 举报
下次问题解决了就把类型改成提问结束!谢谢!
回复 使用道具 举报
好的,老是忘记。呵呵
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马