2017-10-04 7 views
-1

내 입력 날짜 (형식 mm/dd/yyyy HH:mm:ss)가 startDateendDate 범위 내에 있는지 아래 코드를 사용합니다.Java DateComparison

나는이 논리에서 compareTo()을 사용합니다. 그러나 형식이 mm/dd/yyyy 인 경우, 월만을 비교하고 "MYLOGIC methood"에 출력을 인쇄합니다. 그러나 입력 된 날짜가 startDateendDate 범위 내에 있는지 비교하기 위해 비교할 연도가 필요합니다.

public class DateLogicNew { 

    public static void main(String[] args) { 
     String startDate[] = new String[1]; 
     String endDate[] = new String[1]; 
     startDate[0] = "01/01/0600 00:00:00"; 
     endDate[0] = "11/27/3337 00:00:00"; 

     String inputArr[] = { "05/01/0500 01:00:00", "11/27/3337 00:00:00", 
       "05/05/0700 00:00:00", "11/27/2337 00:00:00", 
       "06/05/4000 00:00:00" }; 

     String protectedArr[] = new String[inputArr.length]; 
     int temp[] = new int[inputArr.length]; 

     System.out.println(inputArr.length); 

     System.out.println("Length of the inputArr: " + inputArr.length); 
     // System.out.println(""); 

     for (int i = 0; i < inputArr.length; i++) { 

      if (inputArr[i] 
        .matches("^([0-1][0-9])/([0-3][0-9])/([0-9]{4})(?:([0-2][0-9]):([0-5][0-9]):([0-5][0-9]))?$")) { 
       System.out.println("Inside if loop"); 

       if (inputArr[i].compareTo(startDate[0]) > 0 
         && inputArr[i].compareTo(endDate[0]) < 0) { 
        System.out.println("inside the compare condition"); 
        temp[i] = 1; 
        protectedArr[i] = inputArr[i]; 
        System.out 
          .println("Values of the inputArr in MYLOGIC method : " 
            + protectedArr[i]); 
       } 
      } else { 
       temp[i] = 0; 
      } 
     } 
     System.out.println(""); 

     for (int i = 0; i < inputArr.length; i++) { 
      if (temp[i] == 1) { 
       inputArr[i] = protectedArr[i]; 
      } 
      System.out 
        .println("Final Value to the output port: " + inputArr[i]); 
     } 
    } 
} 
+1

문제는 무엇이 발생했는지, 예상되는 것, 어떻게 다른지, 일부 샘플 입력 및 출력 등을 명확하게 설명해야합니다. 또한 내장 날짜를 사용하는 것이 더 쉽습니다 파싱 ​​및 처리 라이브러리. – pvg

+1

왜 비교를 위해서 실제'Date' 인스턴스를 사용하지 않습니까? 문자열 기반 날짜 비교는 까다로울 수 밖에 없습니다. 문자열 비교는 문자 단위로 이루어 지므로 인덱스 1 (0과 1)의 문자가 독립적으로 비교되기 때문에 '10/31/9999'는 여전히 '11/27/3337'보다 "작습니다" 나머지는 – Thomas

+0

1 년 동안 500 명 중 1 명이 정말로 걱정 되십니까? 아니면 다른 일이 여기에 있습니까? 이 예제 데이터는 이상합니다. –

답변

0

java.time 날짜 - 시간 객체로

구문 분석. 정규 표현식은 잔인합니다.

현대적인 접근 방식은 이전 레거시 날짜 - 시간 클래스가 아닌 java.time 클래스를 사용합니다.

String input = "05/01/0500 01:00:00" ; 
DateTimeFormatter f = DateTimeFormatter.ofPattern("MM/dd/uuuu HH:mm:ss") ; 
LocalDateTime ldt = LocalDateTime.parse(input , f) ; 

isBefore, isAfter, isEqual을 사용하여 비교하십시오.

if((! x.isBefore(start)) && x.isBefore(stop)) { … } 
0

나는 내 질문에 대한 해결책을 알아 냈습니다. 날짜를 비교하기 전에 논리를 보려면 아래 코드를 확인하십시오.

문자열 startDate = "0600/01/01 00:00:00"; String endDate = "3337/11/27 00:00:00";

try { 

     for (int i = 0; i < inputArr.length; i++) { 
      String newDateInput = inputArr[i]; 
      // System.out.println("NewInput:" + newInput); 

      DateFormat parser = new SimpleDateFormat("MM/dd/yyyy"); 
      DateFormat formatter = new SimpleDateFormat("yyyy/MM/dd"); 

      Date convertedDate = parser.parse(newDateInput); 
      String newFormattedInput = formatter.format(convertedDate); 
      // System.out.println("newFormattedInput: " + 
      // newFormattedInput); 
      if (newFormattedInput 
        .matches("^([0-9]{4})/([0-1][0-9])/([0-3][0-9])(?:([0-2][0-9]):([0-5][0-9]):([0-5][0-9]))?$")) { 
       if (newFormattedInput.compareTo(startDate) > 0 
         && newFormattedInput.compareTo(endDate) < 0) { 
        temp[i] = 1; 

        protectedArr[i] = inputArr[i]; 
        System.out 
          .println("Values of the inputArr in PROTECT method : " 
            + protectedArr[i]); 

       } else { 
        temp[i] = 0; 
       } 
      } 
     } 
    } catch (ParseException e) { 
     e.printStackTrace(); 
    }