在Java中操作字符串日期

时间:2014-12-08 14:38:44

标签: java

我有这个方法isFormatDateCorrect返回true,如果这个格式(NNNN@YYYY-MM-DD)的日期是正确的,这个方法是正确的。

public boolean isFormatDateCorrect(String date) {
   if (date == null || date.length() == 0) {
          return false;
     }                   //NNNN@YYYY-MM-DD
   return date.matches("([0-9]{4})@([0-9]{4})-([0-9]{2})-([0-9]{2})");
}

这里我有isValidDate的其他方法,但是当我得到它时我有错误 进程数,年,月和日,我使用date.substring();但这种方法只返回假

public boolean isValidDate(String date) {

        int process_number, day, month, year, max_days = 0;

        if (date == null || date.length() == 0) {
            return false;
        }

        //The correct format of date is NNNN@YYYY-MM-DD
        if (isFormatDateCorrect(date) != true) {
            return false;
        }
        //NNNN@YYYY-MM-DD(process_number@Year-month-day)
        process_number = Integer.parseInt(date.substring(0, date.indexOf("@")));//get process number
        year = Integer.parseInt(date.substring(date.indexOf("@") + 1, date.indexOf("-")));// get year
        month = Integer.parseInt(date.substring(date.indexOf("-") + 1,  date.lastIndexOf("-")));// get month
        day = Integer.parseInt(date.substring(date.lastIndexOf("-") + 1,  date.lenght()));//get day

        if (month < 1 || month > 12) {
            return false;
        } else {
            switch (month) {
                case 1:
                case 3:
                case 5:
                case 7:
                case 8:
                case 10:
                case 12:
                    max_days = 31;
                    break;

                case 4:
                case 6:
                case 9:
                case 11:
                    max_days = 30;
                    break;

                case 2:
                    if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)) {
                        max_days = 29;
                    } else {
                        max_days = 28;
                    }
                    break;
            }
            if (day < 1 || day > max_days) {
                return false;
            }
        }
        return true;
    }

例如,在Main中,当我测试时

String date = "1234@2014-12-25"
if(isValidDate(date) != true){
     System.out.println("This date is invalid");
}else{
System.out.println("This date is valid");
}

,输出为:

  

System.out.println(“此日期无效”);

2 个答案:

答案 0 :(得分:1)

public static boolean isValidDate(String inDate) {
SimpleDateFormat dateFormat = new SimpleDateFormat("YYYY-MM-DD");
dateFormat.setLenient(false);
try {

   dateFormat.parse(inDate.substring(0,( inDate.indexOf("@") - 1 ));
} catch (ParseException pe) {
  return false;
}
return true;
}

使用这个simle技巧。

答案 1 :(得分:0)

实际上我运行了你的代码并为我打印“这个日期有效”。你确定你没有错过屏幕上的任何消息吗?我复制了你的代码并且必须修复拼写错误“lenght” - &gt; “长度”。也许您的代码没有成功重新编译,然后您运行了旧版本。

但是,如果您没有将这些内容用作代码kata,我建议您使用java.util.Date,甚至更好java.util.Calendar,或者更好地使用新的java.time包,而不是重新发明轮子。

Java API提供了许多解析和计算日期和时间的方法。它支持区域设置,不同的日历,时区。如果一颗流星撞到一个略微不同的轨道上,改变一些大约几天或几年左右的时间(闰秒,闰年和东西),Java更新将修复你的代码 - 如果你使用了API。或者如果无神论者接管并将这一年改回原来的定义为13个月而不是12个(12个只是因为那些自大的罗马皇帝)。我的意思是,没有可能,但你永远不知道,为什么要通过重新发明轮子来重复这些努力。