Java 날짜 시간 비교 차이 더하기

반응형

아직도!!!!!!!!!!!!!!

Calender Date 사용하려는 혹은 사용하고 있는 저 같은분들을 위해 준비한 글입니다.

 

Java 8 부터 java.time(joda.time) api 출시 됐기 때문에,

Java version 8 이상만 가능합니다.

 

Java 시간 API 시대 흐름순


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

 

 

LocalDate

 

 

개념


로컬 날짜 클래스로 날짜 정보만 필요할 때 사용

날짜 정보만 출력됩니다 날짜 정보만~

 

 

문법


// 로컬 컴퓨터의 현재 날짜 정보를 저장한 LocalDate 객체를 리턴
LocalDate currentDate = LocalDate.now();
// result : 2019-11-13

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

 

 

LocalTime

 

 

개념


로컬 시간 클래스로 시간 정보만 필요할 때 사용

 

시간 정보만 출력됩니다 시간 정보만~

 

 

문법


// 로컬 컴퓨터의 현재 시간 정보를 저장한 LocalDate 객체를 리턴. 
LocalTime currentTime = LocalTime.now();   
// 결과 : 18:34:22

// 파라미터로 주어진 시간 정보를 저장한 LocalTime 객체를 리턴.
LocalTime targetTime = LocalTime.of(12,33,35,22); 
// 끝에 4번째 매개변수는 nanoSecond 인데 선택 값이다 굳이 쓰지 않아도 된다.
// 결과 : 12:32:33.0000022

 

 

LocalDateTime

 

 

개념


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

날짜와 시간 정보 출력~

 

 

문법

 


// 로컬 컴퓨터의 현재 날짜와 시간 정보
LocalDateTime currentDateTime = LocalDateTime.now();    
// 결과 : 2019-11-12T16:34:30.388

LocalDateTime targetDateTime = LocalDateTime.of(2019, 11, 12, 12, 32,22,3333);
// 여기도 second,nanoSecond 매개변수는 필수가 아닌 선택입니다.
// 결과 : 2019-11-12T12:32:22.000003333

 

날짜 더하기

LocalDateTime currentDateTime = LocalDateTime.now();
// 더 하기는 plus***() 빼기는 minus***()
// currentDateTime.plusYears(long) or minusYears(long)
currentDateTime.plusDays(2)
// 결과 : 2019-11-14T12: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일을 반환 하려면?

 

전체 시간을 기준으로 차이 계산하기

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

전체 나노초 차이

 

시간 차이 계산

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);

 

날짜 변환 [jekalmin의 블로그] 참조

 

 

해당 월에 마지막 날짜 찾기

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 = 해당 주차에 월요일

 

TMI((Too Much Information)


위에 예제처럼 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 성공

 

ISO 자세히 알기

 

[ISO] ISO 8601 개념

ISO 날짜 형식이란? 정식 명칭 Date elements and interchange formats - Information interchange - Representation of dates and times 미쳤다.. 현재 제일 최신 버전 ISO 8601 구버전 ISO 8601:2000, ISO 8601:..

java119.tistory.com

반응형

+ Recent posts