수신받은 메시지에서 시간(문자열) 확인 후
현재시간과 비교하기위해서 시간객체로 비교를 해야하는데
1. 수신 문자열 String (수신문자열) -> SimpleDateFormat 을 통한 수신 Date 객체 생성.
2. Calendar 생성 후 비교용 Date 생성
3. 수신 Date 객체와 비교용 Date 객체 비교
하는데
SimpleDateFormat formater = new SimpleDateFormat("yyyyMMddHHmmss");
이거 쓰기
package Main;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class main {
public static void main(String[] args)
{
String test_yyyy= "2022";
String test_MM = "01";
String test_dd = "99";
String test_time = "230070";
StringBuilder time = new StringBuilder();
// time.append( String.format("%04d", test_yyyy) );
// time.append( String.format("%02d", test_MM) );
// time.append( String.format("%02d", test_dd) );
// time.append( String.format("%06d", test_time) );
time.append( test_yyyy );
time.append( test_MM );
time.append( test_dd );
time.append( test_time );
Date now = Calendar.getInstance().getTime();
Calendar nowCal = Calendar.getInstance();
nowCal.setTime(now);
// 문자열 -> 일자형으로 바꿀때 쓰는 심플포맷터 형식 확인
// yyyyMMddhhmmss
// yyyyMMddhhmmss = > YYYY 적용시 20220101230000(문자열) -> 시간객체 = 문자열 결과 : 20221226230000 출력
// yyyyMMddhhmmss -> 달(MM)을 mm 으로 적용하면 분단위
// yyyyMMddhhmmss => 일자(dd) DD 로 적용시 => 입력값 (20220199230000) -> (출력) 20220499230000
// 일자(dd) dd 로 적용시 => 입력값 (20220199230000) -> (출력) 20220409230110
// yyyyMMddhhmmss => 시간(hh) hh 적용시 = 12 시간 표기법
// 시간(hh) 적용시 = 24 시간 표기법
// yyyyMMDDHHmmss => 초(ss) SS 적용시 = 초가 70일때 70초로 들어감 => 20220101230070
// 초(ss) ss 적용시 = 초가 70일때 1분 10초로 들어감 => 20220101230110
SimpleDateFormat formater = new SimpleDateFormat("yyyyMMddHHmmss");
System.out.println( "문자열 -> 시간 객체로 변경전 확인. time : " + time.toString());
Date receiveDataTime = null;
try {
receiveDataTime = formater.parse(time.toString());
}
catch (Exception e) {
e.printStackTrace();
}
System.out.println( "문자열 -> 시간 객체로 바꾼후 확인. time : " + receiveDataTime.toString());
System.out.println( "문자열 -> 시간 객체 -> 문자열로 바꾼후 확인. time : " + formater.format(receiveDataTime) );
Calendar checkBefore = nowCal.getInstance();
checkBefore.add( Calendar.DATE , -1);
Date beforeLimit = checkBefore.getTime();
Calendar checkAfter = nowCal.getInstance();
checkAfter.add( Calendar.DATE , 1);
Date afterLimit = checkAfter.getTime();
boolean isTimeBeforeError = false;
boolean isTimeAfterError = false;
if( receiveDataTime.before(beforeLimit) ) {
System.out.println( " 받은거 << 최소범위 ((받은거 여기 있어야함)) 최대범위" );
System.out.println("receiveDataTime : " + receiveDataTime.toString() + " before Limit : " + beforeLimit.toString() );
isTimeBeforeError = true;
}
if( receiveDataTime.after(afterLimit) ) {
System.out.println( " 최소범위 ((받은거 여기 있어야함)) 최대범위 << 받은거 " );
System.out.println("receiveDataTime : " + receiveDataTime.toString() + " after Limit : " + afterLimit.toString() );
isTimeAfterError = true;
}
}
}
장비의 수신데이터를 보다 정확히 처리하려고 노력할 때 발생한 문제.
발생 한 현상---------------------------------------------------------
수신된 데이터내에서 시간부분을 확인.
장비에서 수신된 시간이
현재 년도부분이 2022년이 아닌 2034년이나
월 부분이 19월이나 14월 등으로 수신되는등
시간 포맷에 맞지 않는 데이터를 송신하며,
시간 포맷에 맞는경우일지라도, 정확하지 않은 시간을 보내는 경우가 존재.
-----------------------------------------------------------------------
저지른 실수--------------------------------------------------------------
포맷지정 오류 | SimpleDateFormat formater = new SimpleDateFormat("yyyymmddhhmmss");
---------------------------------------------------------------------------
포맷지정 정상 | SimpleDateFormat formater = new SimpleDateFormat("yyyyMMddHHmmss");
문자열로 수신된 시간 정보를 현재 시간과 비교하기 위해
DATE로 변환하는 과정에서 생긴 오류.
문자열을 DATE 객체로 뽑아낼때
SimpleDateFormat를 이용해서 변환하는데
SimpleDateFormat 의 각일자 데이터 형식 지정시 대소문자의 여부에 따라
1. 문자열 시간 -> 2. Date 시간 객체 - > 3. 문자열 시간
3. 문자열 시간 데이터의 값이 달라짐.
SimpleDateFormat 형식 지정시 "yyyyMMddHHmmss" 가
내가 원하는 형태로
(4자리수)연도
(2자릿수)월
(2자릿수)일
(2자릿수, 24시간표기법) 시간
(2자릿수)분
(2자릿수)초
각 해당 열의 시간 범위 초과시 상위 일자 증가
형태로 출력할 수 있음.
여기서 포맷 지정시 잘못된 방법으로 사용하였음.
'Programming > JAVA' 카테고리의 다른 글
[JAVA/SpringBoot] 잘되던놈이 갑자기 안된다. @어노테이션 (0) | 2022.03.04 |
---|---|
[JAVA] 표준프로토콜 준수는 아주 중요하다 (0) | 2022.03.04 |
[JAVA] 공공데이터포털 윈도우에서 수신 인코딩문제 (0) | 2022.01.24 |
[JAVA / Netty] 클라이언트 오류 해결 (0) | 2021.12.14 |
[java/netty] 클라이언트 재접속 오류 (0) | 2021.12.09 |
댓글