LocalDateTime 빼기 - LocalDateTime ppaegi

이전 블로그에서 옮겨온 포스트

Java8 이전까지는 Java에서 날짜 계산은 Calendar를 사용했다. 윤달 체크 같은 것도 해줘서 좋은데, 사용하기 너무 번거로웠다. 그리고 mutable이기 때문에 전혀 예상치 못 하게 값이 변경될 수 있다.

import java.util.Calendar

Calendar rightNow = Calendar.getInstance(); // 현재 시간
rightNow.add(Calendar.DATE, 3); // 3일 뒤
rightNow.add(Calendar.MONTH, -3); // (위에서 바꾼 3일 뒤의) 3달 전

Java8에서 새로 추가된 날짜 관련 클래스들(java.time 패키지)은 조금 나아졌다. 그리고 immutable이기 때문에, thread-safe 하다는 장점도 있다. LocalDateTime

import java.time.LocalDateTime;

LocalDateTime now = LocalDateTime.now(); // 현재시간
LocalDateTime threeYearsAfter = now.plusYears(3); // 3년 뒤 - now는 계속 현재시간
LocalDateTime twoDaysAgo = now.minusDays(2); // 2일 전
LocalDateTime twoDaysAndThreeHoursAgo = now.minusDays(2).minusHours(3); // 2일 3시간 전

중요한 차이점은 immutable이기 때문에, 한번 만들어지면 plus/minus를 해도 변하지 않아서 now는 끝까지 처음 시간을 유지한다. 그리고 리턴값으로 변경된 LocalDateTime을 값을 넘겨주기 때문에 계속 메소드 체이닝을 할 수 있어서 코드가 조금은 이뻐진다. Calendar의 경우는 add() 메소드가 void이기 때문에 변수를 계속 불러줘야 했다.

LocalDateTime 클래스는 timezone 정보가 없는 날짜와 시간을 표현할 수 있는 클래스이고, LocalDate와 LocalTime은 각각 날짜만 표현하거나 시간만 표현하는 클래스이다. timezone 정보를 함께 표현하고 싶다면, ZonedDateTime을 사용하면 된다.

Date를 LocalDateTime으로 변경하려면 아래처럼 하면 된다. Date를 Java8에서 추가된 시점(특정 시각) 클래스인 Instant로 변경하고 timezone을 설정하면 변경할 수 있다. ZoneId 역시 timezone을 나타내기 위해 새로 추가된 클래스이다.

LocalDateTime now = new Date()
    .toInstant()
    .atZone(ZoneId.systemDefault())
    .toLocalDateTime() // .toLocalDate(), .toLocalTime() 도 있다.

참고

  • Java – How to add days to current date
  • LocalDateTime
  • LocalDate
  • LocalTime
  • ZonedDateTime
  • Instant
  • ZoneId

  • #java
  • #date
  • #add
  • #sub

LocalDate 년, 월, 일 더하기 및 빼기

이번 포스팅은 Java의 LocalDate의 날짜를 더하거나 빼는 방법을 소개합니다.


LocalDate에 년, 월, 주, 일 더하기

LocalDate 클래스에서 제공하는 다음 네 가지 메서드를 사용하여 LocalDate 객체에 년, 월, 주, 일을 더할 수 있습니다.

plusYears()

- 이 메서드를 호출한 LocalDate 객체에 년도(year)가 더해진 LocalDate 객체를 반환합니다.

plusMonths()

- 이 메서드를 호출한 LocalDate 객체에 월(month)이 더해진 LocalDate 객체를 반환합니다.

plusWeeks()

- 이 메서드를 호출한 LocalDate 객체에 주(week)가 더해진 LocalDate 객체를 반환합니다.

plusDays()

- 이 메서드를 호출한 LocalDate 객체에 일(day)이 더해진 LocalDate 객체를 반환합니다.

다음 예제는 오늘 날짜에 5년 뒤, 10개월 뒤, 3주 뒤, 20일 뒤 날짜를 콘솔에 출력합니다.

public static void main(String args[]) {
  LocalDate todayLocalDate = LocalDate.now();
  System.out.println("오늘 날짜: " + todayLocalDate);

  LocalDate fiveYearsAfterLocalDate = todayLocalDate.plusYears(5);
  System.out.println("5년 뒤: " + fiveYearsAfterLocalDate);

  LocalDate tenMonthsAfterLocalDate = todayLocalDate.plusMonths(10);
  System.out.println("10개월 뒤: " + tenMonthsAfterLocalDate);

  LocalDate threeWeeksAfterLocalDate = todayLocalDate.plusWeeks(3);
  System.out.println("3주 뒤: " + threeWeeksAfterLocalDate);

  LocalDate twentyAfterLocalDate = todayLocalDate.plusDays(20);
  System.out.println("20일 뒤: " + twentyAfterLocalDate);
}

[실행 결과]

오늘 날짜: 2022-08-13
5년 뒤: 2027-08-13
10개월 뒤: 2023-06-13
3주 뒤: 2022-09-03
20일 뒤: 2022-09-02

LocalDate에 년, 월, 주, 일 빼기

LocalDate 클래스에서 제공하는 다음 네 가지 메서드를 사용하여 LocalDate 객체에 년, 월, 주, 일을 뺄 수 있습니다.

minusYears()

- 이 메서드를 호출한 LocalDate 객체에 년도(year)가 차감된 LocalDate 객체를 반환합니다.

minusMonths()

- 이 메서드를 호출한 LocalDate 객체에 월(month)이 차감된 LocalDate 객체를 반환합니다.

minusWeeks()

- 이 메서드를 호출한 LocalDate 객체에 주(week)가 차감된 LocalDate 객체를 반환합니다.

minusDays()

- 이 메서드를 호출한 LocalDate 객체에 일(day)이 차감된 LocalDate 객체를 반환합니다.

다음 예제는 오늘 날짜에 3년 전, 9개월 전, 2주 전, 25일 전 날짜를 콘솔에 출력합니다.

public static void main(String args[]) {
  LocalDate todayLocalDate = LocalDate.now();
  System.out.println("오늘 날짜: " + todayLocalDate);

  LocalDate threeYearsBeforeLocalDate = todayLocalDate.minusYears(3);
  System.out.println("3년 전: " + threeYearsBeforeLocalDate);
 
  LocalDate nineMonthsBeforeLocalDate = todayLocalDate.minusMonths(9);
  System.out.println("9개월 전: " + nineMonthsBeforeLocalDate);

  LocalDate threeWeeksAfterLocalDate = todayLocalDate.minusWeeks(3);
  System.out.println("3주 뒤: " + threeWeeksAfterLocalDate);

  LocalDate twentyFiveBeforeLocalDate = todayLocalDate.minusDays(25);
  System.out.println("25일 전: " + twentyFiveBeforeLocalDate);
}

[실행 결과]

오늘 날짜: 2022-08-13
3년 전: 2019-08-13
9개월 전: 2021-11-13
3주 뒤: 2022-07-23
25일 전: 2022-07-19