Gardon的18岁生日就要到了,他当然很开心,可是他突然想到一个问题,是不是每个人从出生开始,到达18岁生日时所经过的天数都是一样的呢?似乎并不全都是这样,所以他想请你帮忙计算一下他和他的几个朋友从出生到达18岁生日所经过的总天数,让他好来比较一下。 
Input 一个数T,后面T行每行有一个日期,格式是YYYY-MM-DD。如我的生日是1988-03-07。Output T行,每行一个数,表示此人从出生到18岁生日所经过的天数。如果这个人没有18岁生日,就输出-1。Sample Input 
1
1988-03-07Sample Output 6574

解决方案 »

  1. import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.Scanner;
    public class BirthdayEighteen{ public static void main(String[] args) {
    Scanner scanner=new Scanner(System.in);
    int n=scanner.nextInt();
    SimpleDateFormat sim = new SimpleDateFormat("yyyy-MM-dd");
    for(int i=1;i<=n;i++){
    String beginDate=scanner.next();
    int year=Integer.parseInt(beginDate.substring(0, 4));
    if((year%4==0&&year%100!=0)||year%400==0){//是不是闰年的2月29号,没十八岁生日
    if(beginDate.substring(5, 10).equals("02-29"))
    {System.out.println(-1);break;}
    }
    String t=String.valueOf(year+18);
    String endDate=beginDate.replaceAll(beginDate.substring(0, 4), t);
    try {
    Date d1 = sim.parse(beginDate);
    Date d2 = sim.parse(endDate);
    long a=d2.getTime()-d1.getTime();
    long day=a/(3600L * 1000 * 24);//求天数
    System.out.println(day);
    } catch (ParseException e) {
    e.printStackTrace();
    } } }}
     连接:http://acm.hdu.edu.cn/showproblem.php?pid=1201
      

  2. import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.Scanner;
    public class BirthdayEighteen{public static void main(String[] args) {
    Scanner scanner=new Scanner(System.in);
    int n=scanner.nextInt();
    SimpleDateFormat sim = new SimpleDateFormat("yyyy-MM-dd");
    for(int i=1;i<=n;i++){
    String beginDate=scanner.next();
    int year=Integer.parseInt(beginDate.substring(0, 4));
    if((year%4==0&&year%100!=0)||year%400==0){//是不是闰年的2月29号,没十八岁生日
    if(beginDate.substring(5, 10).equals("02-29"))
    {System.out.println(-1);break;}
    }
    String t=String.valueOf(year+18);
    String endDate=beginDate.replaceAll(beginDate.substring(0, 4), t);
    try {
    Date d1 = sim.parse(beginDate);
    Date d2 = sim.parse(endDate);
    long a=d2.getTime()-d1.getTime();
    long day=a/(3600L * 1000 * 24);//求天数
    System.out.println(day);
    } catch (ParseException e) {
    e.printStackTrace();
    }}}}
      

  3. 供参考
    import java.util.Calendar;
    import java.util.GregorianCalendar;public class Birthday {
    public static long getDays(Calendar birthday){
    //新建日期对象,存储18年后的这一天
    Calendar now = new GregorianCalendar();
    now.set(Calendar.YEAR, birthday.get(Calendar.YEAR)+18);
    now.set(Calendar.MONTH, birthday.get(Calendar.MONTH));
    now.set(Calendar.DAY_OF_MONTH, birthday.get(Calendar.DAY_OF_MONTH));
    //如果这一天和birthday不是同一个月,即当年没有生日
    if(now.get(Calendar.MONTH)!=birthday.get(Calendar.MONTH)){
    return -1L;
    }
    //两个时间转成毫秒数然后计算出天数
    long time = now.getTimeInMillis()-birthday.getTimeInMillis();
    long days = time/(1000*3600*24);
    return days;
    }
    public static void main(String[] args) {
    Calendar birthday = new GregorianCalendar(1987,2,28);
    System.out.println(getDays(birthday));
    }
    }
      

  4. GregorianCalendar(1987,2,28);如果你传的参数不合法,会自动转换的,比如你传1987,1,29,代表1987年2月29,
    而实际上2月没有29号,所以会自动转换成1987年3月1日
      

  5. import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.Scanner;
    public class BirthdayEighteen{public static void main(String[] args) {
    Scanner scanner=new Scanner(System.in);
    int n=scanner.nextInt();
    SimpleDateFormat sim = new SimpleDateFormat("yyyy-MM-dd");
    for(int i=1;i<=n;i++){
    String beginDate=scanner.next();
    int year=Integer.parseInt(beginDate.substring(0, 4));
    if((year%4==0&&year%100!=0)||year%400==0){//是不是闰年的2月29号,没十八岁生日
    if(beginDate.substring(5, 10).equals("02-29"))
    {System.out.println(-1);break;}
    }
    String t=String.valueOf(year+18);
    String endDate=beginDate.replaceAll(beginDate.substring(0, 4), t);
    try {
    Date d1 = sim.parse(beginDate);
    Date d2 = sim.parse(endDate);
    long a=d2.getTime()-d1.getTime();
    long day=a/(3600L * 1000 * 24);//求天数
    System.out.println(day);
    } catch (ParseException e) {
    e.printStackTrace();
    }}}}
      

  6. 4楼的正解...我测试通过了,只是我想不通我的哪错了...import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.Scanner;public class bir18 {    public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            int n = scanner.nextInt();
            SimpleDateFormat sim = new SimpleDateFormat("yyyy-MM-dd");
            for (int i = 1; i <= n; i++) {
                String beginDate = scanner.next();
                int year = Integer.parseInt(beginDate.substring(0, 4));
                if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {//是不是闰年的
                    if (beginDate.substring(5, 10).equals("02-29")) {//2月29号,没十八岁生日
                        System.out.println(-1);
                        break;
                    }
                }
                String t = String.valueOf(year + 18);
                String endDate = beginDate.replaceAll(beginDate.substring(0, 4), t);
                try {
                    Date d1 = sim.parse(beginDate);
                    Date d2 = sim.parse(endDate);
                    long a = d2.getTime() - d1.getTime();
                    long day = a / (3600L * 1000 * 24);//求天数
                    System.out.println(day);
                } catch (ParseException e) {
                    e.printStackTrace();
                }        }    }
    }总是wrong answer啊
      

  7. lz 哪里的题目呀?
    我也去做做
    你也用java做acm,同行,呵呵,交个朋友
      


  8. /*
     * 判断是否为闰年
     */
    public static boolean isLeapYear(int year) {
    return year % 4 == 0 && year % 100 != 0 || year % 400 == 0;
    } /**
     * 计算18周岁的天数
     * @param bYear 出生年份
     * @param bMonth 出生月份
     * @param bDay 出生日数
     */
    public static int getDays(int bYear, int bMonth, int bDay) {
    // 如果是闰年2月29生日,无18岁生日
    if (bMonth == 2 && bDay == 29)
    return -1;
    // 如果是闰年,且是2月29前生日,则从当年开始算.否则从次年开始算
    int startYear = bYear;
    int endYear = bYear + 18 - 1;
    if (!isLeapYear(bYear) || bMonth > 2) {
    startYear++;
    endYear++;
    }
    // 计算第一个可能是闰年的年份
    if (startYear % 4 != 0) {
    startYear = startYear / 4 * 4 + 4;
    }
    // 如果不考虑100倍数的特殊情况,从startYear至endYear,包含(endYear-startYear)/4+1个闰年.
    int days = 365 * 18 + (endYear - startYear) / 4 + 1;
    // 计算endYear前的可以被100整除的年份,即世纪年。比如2000,1900等
    int centuryYear = endYear / 100 * 100;
    // 如果世纪年在计算日期之间,且不能被400整除,天数-1
    if (centuryYear >= startYear && centuryYear % 400 != 0)
    days--;
    //以下为测试输出代码
    System.out.println(bYear + "-" + bMonth + "-" + bDay + "至" + (bYear + 18) + "-" + bMonth + "-" + bDay + "\t共计" + days + "天");
    for (int year = startYear; year <= endYear; year += 4)
    if (year % 100 != 0 || year % 400 == 0)
    System.out.println(year + " 闰年");
    //测试输入代码End
    return days;
    }
      

  9. 测试代码
    getDays(1980, 2, 29);
    getDays(1980, 2, 28);
    getDays(1980, 3, 1);
    getDays(1981, 3, 1);
    getDays(1982, 3, 1);
    getDays(1983, 3, 1);
    getDays(1984, 3, 1);
    getDays(1884, 3, 1);
    测试输出结果
    1980-2-28至1998-2-28 共计6575天
    1980 闰年
    1984 闰年
    1988 闰年
    1992 闰年
    1996 闰年
    1980-3-1至1998-3-1 共计6574天
    1984 闰年
    1988 闰年
    1992 闰年
    1996 闰年
    1981-3-1至1999-3-1 共计6574天
    1984 闰年
    1988 闰年
    1992 闰年
    1996 闰年
    1982-3-1至2000-3-1 共计6575天
    1984 闰年
    1988 闰年
    1992 闰年
    1996 闰年
    2000 闰年
    1983-3-1至2001-3-1 共计6575天
    1984 闰年
    1988 闰年
    1992 闰年
    1996 闰年
    2000 闰年
    1984-3-1至2002-3-1 共计6574天
    1988 闰年
    1992 闰年
    1996 闰年
    2000 闰年
    1884-3-1至1902-3-1 共计6573天
    1888 闰年
    1892 闰年
    1896 闰年ps:注意最后一个测试例子
    1900年不是闰年
      

  10. getDays(1988,3,7)1988-3-7至2006-3-7 共计6574天
    1992 闰年
    1996 闰年
    2000 闰年
    2004 闰年
      

类似问题 »