距离当年1月1日的天数

给你一个格式化日期字符串,让你计算字符串表示的日期距离当年的一月一日有多少天
方法一:

    public int dayOfYear(String date) {
        //难点是一年中的每个月有多少天,好像只有2月不同
        //判断是不是闰年,按照置闰法则:四年一闰,百年不闰,四百年再闰
        String year = date.substring(0, 4);
        int yearInt = Integer.parseInt(year);
        int[][] month = new int[12][2];
        if(yearInt%4 == 0){
            if(yearInt % 100 == 0){
                if(yearInt % 400 == 0){
                    month = new int[][]{{1,31},{2,29},{3,31},{4,30},{5,31},{6,30},{7,31},{8,31},{9,30},{10,31},{11,30},{12,31}};
                }else{
                    month = new int[][]{{1,31},{2,28},{3,31},{4,30},{5,31},{6,30},{7,31},{8,31},{9,30},{10,31},{11,30},{12,31}};
                }
            }else{
                month = new int[][]{{1,31},{2,29},{3,31},{4,30},{5,31},{6,30},{7,31},{8,31},{9,30},{10,31},{11,30},{12,31}};
            }
        }else{
            month = new int[][]{{1,31},{2,28},{3,31},{4,30},{5,31},{6,30},{7,31},{8,31},{9,30},{10,31},{11,30},{12,31}};
        }
        int monthInt = Integer.parseInt(date.substring(5,7));
        int dayInt = Integer.parseInt(date.substring(8,10));
        int res = 0;
        for(int i = 0; i < monthInt-1; i++){
            res += month[i][1];
        }
        res += dayInt;
        return res;
    }

方法二:
使用Calendar、Date、SimpleDateFormat

        //使用Calendar、date、SimpleDateFormat
        //新建一个SimpleDateFormat对象,其日期字符串的格式为"yyyy-MM-dd";
        SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd");
        try {
            //将格式化日期字符串转化成Date对象
            Date date=format.parse("2016-06-12");
            //获得一个Calendar对象并设置时间为date代表的时间
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(date);
            System.out.println(calendar.getTime());
            //获得当前Calendar对象距离1970.1.1 00:00的毫秒数
            long timeInMillis = calendar.getTimeInMillis();
            //将日期设为当年的一月一日
            calendar.set(calendar.get(1),0,1);
            System.out.println(calendar.getTime());
            //直接计算天数
            long days = (timeInMillis - calendar.getTimeInMillis()) / (1000*60*60*24);
            System.out.println(days);
        } catch (ParseException e) {
            e.printStackTrace();
        }

为什么不直接使用Date和SimpleDateFormat呢?
由于Calendar设置时间比Date更加直观和人性化,Calendar类中除了月份是0-11表示的,其他都和我们日常使用一样,Date类中的年起始是1900,月是0-11,日和正常一样,然后设置不像Calendar那么方便。最重要的,Date不是线程安全的。

上一篇:测试用例更新问题


下一篇:蓝桥杯 日历:推算日期与星期