티스토리 뷰

Java/Java8

[Java8]LocalDateTime이란?

Xion 2020. 8. 22. 15:57

LocalDateTime

Java8에서는 새로운 LocalDateTime 이란 녀석이 추가됐습니다

그 이전에는 Calendar나 Date를 사용하여 날짜를 연산했지만 이제는 LocalDateTime을 사용하여 버그 없이 사용할 수 있습니다.

 

Java 시간 API 시대 흐름순으로 정리하자면,

Date > Calendar > time(org.joda.time)

 

LocalDate

->로컬 날짜 클래스로 날짜 정보만 필요할 때 사용했습니다

문법

LocalDate currentDate = LocalDate.now();
//현재 날짜 정보를 저장한 LocalDate 객체 리턴 
// 20xx - xx - xx

LocalDate.of

//파라미터로 주어진 날짜 정보를 저장한 LocalDate 객체를 리턴합니다.
LocalDate targetDate = LocalDate.of(2019,11,12);
//결과 2019-11-12

 

LocalTime

로컬 시간 클래스로 시간 정보만 필요할 때 사용합니다. ( 단, 시간 정보만 출력됩니다 !! )

 

문법

LocalTime currentTime = LocalTime.now();
//18:20:34

LocalTime  a = LocalTime.of(12,33,35,22);
//끝에 4번째 매개변수는 nanoSecond입니다. (선택 값)
//결과 : 12:32:33.0000022

 

이제 새로운 LocalDateTime입니다

LocalDateTime

날짜와 시간 정보 모두가 필요할 때 사용합니다.

(날짜, 시간정보 모두 출력 !!!)

 

문법

LocalDateTime currentDateTime = LocalDateTime.now();
// 2020-02-03T16:33:30.333

LocalDateTime target = LocalDateTime.of(2020,02,03,12,32,22,3333);
//여기도 second,nanoSecond는 선택 값입니다.
//결과 : 2020-02-03T12:32:22:22.00000333

날짜더하기

LocalDateTime currentDateTime = LocalDateTime.now();
// 더 하기는 plus***() 빼기는 minus***()
// currentDateTime.plusYears(long) or minusYears(long)
currentDateTime.plusDays(2)
// 결과 : 2020-02-05T12:32:22.000003333

리턴 타입

메소드(매개변수)

설명

java.time.LocalDateTime

plusYears()

java.time.LocalDateTime

plusMonths()

java.time.LocalDateTime

plusWeeks()

java.time.LocalDateTime

plusDays()

java.time.LocalDateTime

plusHours()

java.time.LocalDateTime

plusMinutes()

java.time.LocalDateTime

plusSeconds()

java.time.LocalDateTime

plusNanos()

밀리초

빼기도 동일합니다. minusYear(),minusMonths()

 

 

날짜 비교

LocalDateTime startDateTime = LocalDateTime.now();  
// 결과 : 2019-11-12T12:32:22.000003332
LocalDateTime endDateTime = LocalDateTime.of(2019, 11, 12,12, 32,22,3333);
// 결과 : 2019-11-12T12:32:22.000003333

// startDateTime이 endDateTime 보다 이전 날짜 인지 비교
startDateTime.isBefore(endDateTime);    
// 결과 : true

// 동일 날짜인지 비교
startDateTime.isEqual(endDateTime);
// 결과 : false

// startDateTime이 endDateTime 보다 이후 날짜인지 비교
startDateTime.isAfter(endDateTime); 
// 결과 : false

주의 : 나노초가 존재할 경우 나노초의 시간까지 비교합니다.

 

시간 비교

LocalTime startTime = LocalTime.now();  
// 결과 : 23:52:35
LocalTime endTime = LocalTime.of(23, 59, 59);
// 결과 : 23:59:59

// startTime이 endTime 보다 이전 시간 인지 비교
startTime.isBefore(endTime);    
// 결과 : true

// startTime이 endTime 보다 이후 시간 인지 비교
startTime.isAfter(endTime); 
// 결과 : false

날짜 차이 계산

LocalDate startDate = LocalDate.now(); 
// 결과 : 2019-11-12
LocalDate endDate = LocalDate.of(2019,12,13);
// 결과 : 2019-12-13

Period period = Period.between(startDate, endDate);

period.getYears();      // 0년
period.getMonths();     // 1개월
period.getDays();       // 1일 차이

주의 : startDate와 end가 31일 차이가 나서 리턴이 31일이 되는 것이 아니라 1개월 1일로 반환됩니다.

무심코 period.getDays()로 비교했다간 다칠 수 있습니다.

 

31일 반환법

전체 시간을 기준으로 차이 계산하기 ( ChronoUnit 이용 )

LocalDate startDate = LocalDate.now(); 
// 결과 : 2019-11-12
LocalDate endDate = LocalDate.of(2019,12,13);
// 결과 : 2019-12-13

ChronoUnit.DAYS.between(startDate, endDate); 
// 결과 : 31 (1개월 1일)

클래스

설명

ChronoUnit.YEARS

전체 년 차이

ChronoUnit.MONTHS

전체 월 차이

ChronoUnit.WEEKS

전체 주 차이

ChronoUnit.DAYS

전체 일 차이

ChronoUnit.HOURS

전체 시간 차이

ChronoUnit.SECONDS

전체 초 차이

ChronoUnit.MILLIS

전체 밀리초 차이

ChronoUnit.NANOS

전체 나노초 차이

시간 차이 계산 ( " Duration " 이용 )

LocalTime startTime = LocalTime.now();  
// 결과 : 17:14:55
LocalTime endTime = LocalTime.of(18,17,35);
// 결과 : 18:17:35

Duration duration = Duration.between(startTime, endTime);
duration.getSeconds();      
// 결과 : 3742
duration.getNano();
// 결과 : 922000000

날짜 포맷

LocalDateTime now = LocalDateTime.now();
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy년 M월 d일 a h시 m분");
String nowString = now.format(dateTimeFormatter);   
// 결과 : 2019년 11월 12일 오후 7시 2분

LocalDateTime now2 = LocalDateTime.now();  
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss");
// 결과 : 2019-11-12 07:26:12

주의 : 포맷의 두번째 예제에 07는 19시입니다. 24시간 표기가 아닙니다. 

 

날짜 변환

 

LocalDate -> String

LocalDate.of(2020, 12, 12).format(DateTimeFormatter.BASIC_ISO_DATE);

LocalDateTime -> String

LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));

LocalDate -> java.sql.Date

Date.valueOf(LocalDate.of(2019, 12, 27));

LocalDateTime -> java.util.Date

Date.from(LocalDateTime.now().atZone(ZoneId.systemDefault()).toInstant());

LocalDateTime -> java.sql.Timestamp

Timestamp.valueOf(LocalDateTime.now());

String -> LocalDate

LocalDate.parse("1995-05-09");
LocalDate.parse("20191224", DateTimeFormatter.BASIC_ISO_DATE); 

String -> LocalDateTime

LocalDateTime.parse("2019-12-25T10:15:30");
LocalDateTime.parse("2019-12-25 12:30:00", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));

java.util.Date -> LocalDateTime

LocalDateTime.ofInstant(new Date().toInstant(), ZoneId.systemDefault());

LocalDateTime -> LocalDate

LocalDate.from(LocalDateTime.now());

LocalDate -> LocalDateTime

LocalDate.now().atTime(2, 30);

해당 월에 마지막 날짜 찾기

String targetDate = "2020-02-02";

YearMonth targetYearMonth = YearMonth.from(LocalDate.parse(targetDate, DateTimeFormatter.ofPattern("yyyy-MM-dd")));

//해당 월의 일 수(int)
System.out.println(targetYearMonth.lengthOfMonth()); // 29

//해당 월의 마지막 날(LocalDate)
System.out.println(targetYearMonth.atEndOfMonth()); // 2020-02-29

해당 주차의 날짜 찾기

final long calendarWeek = 34; //34주차 입력
LocalDate desiredDate = LocalDate.now()
            .with(IsoFields.WEEK_OF_WEEK_BASED_YEAR, calendarWeek)
            .with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY));
//결과 : 2020-08-17 
//DayOfWeek.MONDAY = 해당 주차에 월요일

위에 예제처럼 LocalDateTime startDateTime = LocalDateTime.now(); 하게 되면

// 결과 : 2019-11-12T12:32:22.000003332 이러한 결과가 나오는데 여기서 중간에 T는 뭘까?

바로 ISO 형식 시간표기법이다.

 

그 말은 즉, String으로 날라온 매개변수를 LocalDateTime로 파싱할때

'T'가 없으면 java.time.format.DateTimeParseException이 발생한다는 뜻입니다.

 

반짝 예시

String date = "2019-11-12 12:30:54"
LocalDateTime localdatetime = LocalDateTime.parse(date);
// 결과 : java.time.format.DateTimeParseException

String date = "2019-11-12T 12:30:54";
LocalDateTime localdatetime = LocalDateTime.parse(date);
// 결과 : parse 성공

'Java > Java8' 카테고리의 다른 글

스트림과 병렬 처리  (0) 2021.05.29
[java] and(), or(), negate() 디폴트 메소드와 isEqual()정적 메소드  (0) 2020.10.28
[Java8] Date와 Time API  (0) 2020.08.01