본문 바로가기
Programming/JAVA

[JAVA] 문자열 -> 시간 DATE 객체 변환 총정리

by Pendine 2022. 2. 7.
728x90

수신받은 메시지에서 시간(문자열) 확인 후

현재시간과 비교하기위해서 시간객체로 비교를 해야하는데

 

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자릿수)초

각 해당 열의 시간 범위 초과시 상위 일자 증가

형태로 출력할 수 있음.

 

여기서 포맷 지정시 잘못된 방법으로 사용하였음.

728x90

댓글