본문 바로가기

Java

[Java] 시간(Time)/날짜(Date) 제공 클래스 및 시간 비교

개발하다가 데이터의 상태값과 시간을 기준으로 상태값이 정상인지 어떻게 찾을지 구글링 중 자바 8부터 제공되는 클래스들을 알게되었다. 

원래는 Date나 Calender클래스를 Java 8 이전에는 사용했었다. 그런데 마침 개발환경 Java 버전이 8이라 이번에 사용해보고 블로그에  간단히 정리해보려고 한다 

 

 

1 종류

1 LocalDateTime

2 LocalDate

3 LocalTime

4 ZonedDateTime

 

1 ~ 3은 이름에서 알 수 있듯이 시스템 기준 Date / Time 을 말한다. 

4 ZonedDateTime은 LocalDateTime + 타임존/시차를 말한다. 따라서 우리나라보다는 미국, 캐나다과 같이 summer time이 있는 국가에 제공되는 서비스를 개발할때 고려하게 되는 부분이라고 생각된다. 

설명이 잘되어 있는 링크: https://www.daleseo.com/java8-zoned-date-time/ 

 

매우매우 간단하지만 바로 간단한 사용예시를 보면 아래와 같다. 

	// Date + Time 표현 
	LocalDateTime localDateTime = LocalDateTime.now();
	System.out.println("localDateTime: " + localDateTime); 
	// localDateTime: 2021-08-16T23:09:09.639491
		
	// Date 표현
	LocalDate localDate = LocalDate.now();
	System.out.println("localDate: " + localDate);
	// localDate: 2021-08-16	

	// Time 표현
	LocalTime localTime = LocalTime.now();
	System.out.println("localTime: " + localTime);
	// localTime: 23:09:09.640090
        
	// 지역 Date + Time 표현 
	ZonedDateTime zoneDataTime = ZonedDateTime.now();
	System.out.println("zoneDataTime: " + zoneDataTime);
	// zoneDataTime: 2021-08-16T23:09:09.640717+09:00[Asia/Seoul]

 

 

2 String 데이터를 시간 클래스로 통일 

시간 비교를 하기 전 다루게 될 시간 표현을 하나로 통일이 필요하다. 

바로 예시로 설명하면 String을  LocalDateTime 로 변경하는 방법은 아래와 같다. 

	// YYYY-MM-DD HH:MM:SS 포맷 String을 localDateTime으로 표현 
	LocalDateTime localTime = LocalDateTime.parse("2021-08-16 10:30:12", 
		DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
	System.out.println("YYYY-MM-DD HH:MM:SS localTime: " + localTime);
	// 2021-08-16T10:30:12
		    
	
	// YYYYMMDDHHMMSS.uuuuuu 포맷 String을 localDateTime으로 표현 
	LocalDateTime localTime2 = LocalDateTime.parse("20210816103012.123", 
		DateTimeFormatter.ofPattern("yyyyMMddHHmmss.SSS"));
	System.out.println("YYYYMMDDHHMMSS.uuuuuu localTime: " + localTime2 );
	// 2021-08-16T10:30:12.123

 

추가로 예시에서 분이나 년도를 내 마음대로 대문자나 소문자로 바꾸려고 했다. 왜냐하면 내가 사용하려던 시간은 mariadb의 now() 결과 였기 때문에  YYYY-MM-DD HH:MM:SS 또는 YYYYMMDDHHMMSS.uuuuuu 형태를 원해서 통일 시키려고 했다. 

그런데 대소문자도 정해진 규칙이 있었다. 

https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html

 

DateTimeFormatter (Java Platform SE 8 )

Parses the text using this formatter, without resolving the result, intended for advanced use cases. Parsing is implemented as a two-phase operation. First, the text is parsed using the layout defined by the formatter, producing a Map of field to value, a

docs.oracle.com

 

위 링크를 표현 Formatter로 규칙이 어떤 것들이 있는지 상세히 알려준다 

더 깔끔한 형태인 Predefined Formatter도 있어서 사용하고 싶었지만 맞는 부분이 없었다 

 

외에도 클래스에서 다양한 메서드들을 제공한다. 

 

 

클래스에서 제공하는 추가 예시들을 알려주시는 참고 링크들 

https://codechacha.com/ko/java-compare-date-and-time/ 

https://krksap.tistory.com/1158

https://java119.tistory.com/52

 

 

 

3 시간/날짜 연산 

개발할때 상태값이 변한 시간 기준으로 비교하는 작업이 있기 때문에 연산하는 방법도 간단히 정리했당.

년/월/일/시간 등등 함수로 제공되는데 바로 예시를 들면 아래와 같다. 

 

LocalDateTime localDateTime = LocalDateTime.parse("2021-08-16T12:10:00.6");
LocalDateTime plusTime = localDateTime
	.plusDays(1)
	.plusHours(2)
	.plusMinutes(10);
		
System.out.println("Changed localDateTime: " + plusTime);
// 출력: 2021-08-17T14:20:00.600
// 1일 2시간 10분이 지난 결과 출력

 

plus가 제공되는걸 보면 minus도 있는것을 확인할 수 있다. 외에도 다양한 메서드가 제공된다.