본문 바로가기
Java, JSP

[Java/자바] 날짜-Date의 모든 것 (현재-내일 날짜, Date 포맷 변환, 날짜 차이 계산, 더하기, 빼기)

by LasBe 2022. 7. 11.
반응형

⚡️자바의 날짜


숙박 예약 프로젝트를 진행하다보니 날짜를 다룰 일이 많았습니다.

 

  • 현재 날짜 구하기
  • 날짜 더하고 빼기
  • 두 날짜 계산하기
  • 프론트와 백앤드의 Date 포멧이 다르기 때문에 포맷변환 등등

계속해서 날짜관련 코드가 중복되다보니,

그것들을 분리해 Util 클래스로 만든 후 전역(static)으로 설정해 유용하게 사용했습니다.

 

그럼 하나하나 사용법을 확인해 보겠습니다.


📌 Date 포맷 변경 / String -> date 포맷 변경 -> String 리턴

private static SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
private static SimpleDateFormat strFormat = new SimpleDateFormat("yyyyMMdd");

// yyyyMMdd -> yyyy-MM-dd	=>	input date value로 넣기 위해 사용
public static String strToDate(String str) {
	Date date;
	try {
		date = strFormat.parse(str);
		return dateFormat.format(date);
		
	} catch (ParseException e) {
		e.printStackTrace();
	}
	return null;
}

DB에 날짜를 저장할 때는 "yyyyMMdd" 포맷으로 저장했지만

프론트에서 input 태그의 date value를 설정할 때는 "yyyy-MM-dd" 포맷을 사용해야 했습니다.

(input 태그 date value에 관한 내용은 이 글을 참조해주세요.)

 

포맷 변환을 위해 SimpleDateFormat를 이용해 두개의 포맷 객체를 생성해주었습니다.

 

외부에서 사용할 땐 파라미터로 문자열 타입의 yyyyMMdd 포맷의 날짜 정보를 받아오고

parse 메소드로 포맷 변환을 한 뒤 format 메소드로 (date -> String) 형 변환을 해주고 리턴해줍니다.


📌 -n / 현재 / +n 날짜 구하기

private static DateTimeFormatter localDateFormat = 
				DateTimeFormatter.ofPattern("yyyyMMdd");

// getTodayPlus(int) 파라미터로 	0 넣으면 오늘, 1 넣으면 내일
public static String getTodayPlus(int plus) {
	LocalDate now = LocalDate.now(); 	// 현재시간
	now = now.plusDays(plus);		// 현재시간 + "plus"일
	return now.format(localDateFormat);	// yyyyMMdd 포매팅
}

현재 날짜와 내일 날짜를 구해야 하는 필요가 있었습니다.

 

그걸 따로 만들기에는 또 몇일 뒤의 날짜를 구해야 하면 새로 코드를 짜야될 소요가 있어서

현재 날짜에 피라미터로 숫자를 받아와 현재 날짜에 그 숫자만큼을 더해 리턴하도록 했습니다.

 

LocalDate.now()를 통해 현재 날짜를 받아오고

plusDays(더할 날짜) 메소드를 통해 현재 날짜에서 가감하도록 만들었습니다.

 

마지막으로 DateTimeFormatter로 포맷을 변경하고 String으로 반환됩니다.


📌 날짜 더하고 빼기

// 날짜 더하기 (음수도 가능)
public static String datePlus(String date, int plus) {
	// yyyy-MM-dd 포맷으로 값이 들어올 시 yyyyMMdd로 변환
	if(date.contains("-")) date = DateParse.dateToStr(date);
    
    	// String date -> LocalDate date / yyyyMMdd 포맷
	LocalDate localDate = LocalDate.parse(date, DateTimeFormatter.BASIC_ISO_DATE);
    
    	// return yyyyMMdd
	return localDate.plusDays(plus).format(DateTimeFormatter.BASIC_ISO_DATE);
}

파라미터로 [계산할 날짜, N]을 받습니다.

 

String인 날짜를 LocalDate로 변환한 뒤

리턴할 때 날짜를 계산하며 LocalDate -> String으로 변환합니다.

 

DateTimeFormatter.BASIC_ISO_DATE은 yyyyMMdd 포맷입니다.


📌 날짜 차이 구하기

private static SimpleDateFormat strFormat = new SimpleDateFormat("yyyyMMdd");

// 날짜 차이 계산 end - start
public static int dateDif(String start, String end) {
	// yyyy-MM-dd -> yyyyMMdd
	if(start.contains("-") || end.contains("-")) {
		start = DateParse.dateToStr(start);
		end = DateParse.dateToStr(end);
	}
	
	try {
		Date startDate = strFormat.parse(start);
		Date endDate = strFormat.parse(end);
        
		int dif = (int) ((endDate.getTime()-startDate.getTime()) / (24*60*60*1000));
		return dif;
		
	} catch (ParseException e) {
		e.printStackTrace();
	}
	
	return -1;
}

날짜 차이를 구하는 코드입니다.

 

일반적으로 날짜는 한달이 29~31일로 구성되어 있어 정수로 계산하면 원하는 값을 얻을 수 없습니다.

 

그렇기 때문에 String -> Date로 형 변환을 해준 뒤

getTime() 메소드로 Date 값을 Long 타입의 밀리세컨드 값으로 변환해 줍니다.

 

밀리세컨드 값으로 날짜를 계산한 뒤 (시간*분*초*밀리세컨드 / 24*60*60*1000) 으로 나누어주면

밀리세컨드 값 -> 날짜 값으로 다시 변환할 수 있습니다.


이렇게 제가 사용했던 날짜 관련 메소드들을 전부 알아보았습니다.

 

DB에 저장하는 포맷과 프론트에 뿌려주는 포맷, 계산하는 포맷이 전부 달라 변환의 연속이었지만

한번 제대로 정리해두고 클래스로 만들어두니 너무나 편하게 사용했던 기억이 있습니다.

 

그럼 전체코드를 마지막으로 마무리하겠습니다.

 

 

 

 

⚡️전체 코드


public class DateParse {
	private static SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
	private static SimpleDateFormat strFormat = new SimpleDateFormat("yyyyMMdd");
	private static DateTimeFormatter localDateFormat = DateTimeFormatter.ofPattern("yyyyMMdd");
	
	// 외부에서 객체 생성 금지 
	private DateParse() {}
	
	// yyyy-MM-dd -> yyyyMMdd	=>	DB에 넣기 위해 사용
	public static String dateToStr(String date) {
		return date.replaceAll("-", "");
	}
	
	// yyyyMMdd -> yyyy-MM-dd	=>	input date value로 넣기 위해 사용
	public static String strToDate(String str) {
		Date date;
		try {
			date = strFormat.parse(str);
			return dateFormat.format(date);
			
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return null;
	}
	
	// getTodayPlus(int) 파라미터로 	0 넣으면 오늘, 1 넣으면 내일
	public static String getTodayPlus(int plus) {
		LocalDate now = LocalDate.now(); 	// 현재시간
		now = now.plusDays(plus);			// 현재시간 + "plus"일
		return now.format(localDateFormat);	// yyyyMMdd 포매팅
	}
	
	// 날짜 더하기 (음수도 가능)
	public static String datePlus(String date, int plus) {
		if(date.contains("-")) date = DateParse.dateToStr(date);
		LocalDate localDate = LocalDate.parse(date, DateTimeFormatter.BASIC_ISO_DATE);
		return localDate.plusDays(plus).format(DateTimeFormatter.BASIC_ISO_DATE);
		// return yyyyMMdd
	}
	
	// 날짜 차이 계산 end - start
	public static int dateDif(String start, String end) {
		if(start.contains("-") || end.contains("-")) {
			start = DateParse.dateToStr(start);
			end = DateParse.dateToStr(end);
		}
		
		try {
			Date startDate = strFormat.parse(start);
			Date endDate = strFormat.parse(end);
			int dif = (int) ((endDate.getTime()-startDate.getTime()) / (24*60*60*1000));
			System.out.println("날짜 차이 : "+dif);
			return dif;
			
		} catch (ParseException e) {
			e.printStackTrace();
		}
		
		return -1;
	}
}
반응형

댓글


오픈 채팅