Covenant




시작하며


Go 언어로 개발하다가 스프링으로 넘어와서 의외로 헷갈렸던 부분이 시간을 다루는 것이었습니다. Go에서는 time, Month 패키지명 부터 시작해서 함수 이름이 상당히 명확한데 LocalDateTime 이라는 이름부터 이상했으며 또 Java 8 이후로는 Date는 사용 안 한다고 하니 레거시는 Date를 사용하고.. 더욱 헷갈렸습니다. 본 글에서는 LocalDateTime을 정리해보겠습니다.




1. LocalDateTime now() - 현재 시스템 시간


  • static LocalDateTime now() - 현재 로컬 컴퓨터의 날짜와 시간을 반환
LocalDateTime.now();
2021-11-08T11:44:30.327959

  • static LocalDateTime now(Clock clock) - Clock에 맞는 현재 날짜와 시간을 반환

Clock 활용법은 javatpoint를 참고하세요.

LocalDateTime.now(Clock.systemDefaultZone());
2021-11-08T11:58:20.551705


  • static LocalDateTime now(ZoneId zone) - ZoneId에 해당하는 날짜 시간을 반환
    • ZoneId를 넘기면 Zone에 해당하는 현재 시간을 반환합니다.
    • ex. 태평양 표준시: America/Los_Angeles, 일본 표준시: JST, 동부 표준시: America/Los_Angeles
LocalDateTime.now(ZoneId.of("Asia/Seoul"));
2021-11-08T11:58:20.551705



2. LocalDateTime 타입 생성


  • static LocalDateTime of(int year, int month, int dayOfMonth, int hour, int minute)
  • static LocalDateTime of(int year, int month, int dayOfMonth, int hour, int minute, int second)
  • static LocalDateTime of(int year, int month, int dayOfMonth, int hour, int minute, int second, int nanoOfSecond)

초, 밀리세컨드는 생략할 수 있습니다. 또한 month는 int 뿐만 아니라 enum형(java.time.Month)을 사용해도 됩니다.

LocalDateTime.of(2021, 1, 1, 0, 0, 0);
2021-01-01T00:00



3. format - LocalDateTime의 출력형식을 변환


  • DateTimeFormatter.ofPattern() 을 사용하면 출력형식을 변환할 수 있습니다.
    • yyyy: 년도
    • MM: 달
    • dd: 일
    • ss: 초
    • SSS: 밀리세컨드
  • ofPattern 인자로 "yyyy-MM-dd HH:mm:ss:SSS", "yyyy-MM-dd HH:mm:ss" 등 다양하게 활용할 수 있습니다.

// localDateTime: 2021년 1월 1일 0시 0분 0초
LocalDateTime localDateTime 
    = LocalDateTime.of(2021, 1, 1, 0, 0, 0);

String localDateTimeFormat1 
    = localDateTime.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS"));

String localDateTimeFormat2 
    = localDateTime.format(
            DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss:SSS")
        );

System.out.println("localDateTime = " + localDateTime);
System.out.println("localDateTimeFormat1 = " + localDateTimeFormat1);
System.out.println("localDateTimeFormat2 = " + localDateTimeFormat2);
localDateTime = 2021-01-01T00:00
localDateTimeFormat1 = 20210101000000000
localDateTimeFormat2 = 2021-01-01 00:00:00:000


ISO 8601(참고 위키백과) 날짜 시간 표준 포멧의 경우 DateTimeFormatter에 등록된 포멧이 있습니다.


// localDateTime: 2021년 1월 1일 0시 0분 0초
LocalDateTime localDateTime = LocalDateTime.of(2021, 1, 1, 0, 0, 0);
String localDateTimeFormat
    = localDateTime.format(DateTimeFormatter.ISO_LOCAL_DATE);

System.out.println("localDateTime = " + localDateTime);
System.out.println("localDateTimeFormat = " + localDateTimeFormat);
localDateTime = 2021-01-01T00:00
localDateTimeFormat = 2021-01-01



4. LocalDateTime에서 년도, 월, 주, 일 조회


  • int getYear() - 년도 반환
  • Month getMonth() - 달 반환
  • int getDayOfMonth() - 일 반환
  • DayOfWeek getDayOfWeek() - 요일 반환
  • int getDayOfYear() - 1년 중 며칠인지 반환
LocalDateTime now = LocalDateTime.now();
System.out.println("getYear() = " + now.getYear());
System.out.println("getMonth() = " + now.getMonth());
System.out.println("getDayOfMonth() = " + now.getDayOfMonth());
System.out.println("getDayOfWeek() = " + now.getDayOfWeek());
System.out.println("getDayOfYear() = " + now.getDayOfYear());
getYear() = 2021
getMonth() = NOVEMBER
getDayOfMonth() = 8
getDayOfWeek() = MONDAY
getDayOfYear() = 312



3. LocalDateTime에서 시간, 분, 초 조회


  • int getHour() - 시간 반환
  • int getMinute() - 분 반환
  • int getSecond() - 초 반환
  • int getNano() - 나노세컨드 반화

LocalDateTime now = LocalDateTime.now();
System.out.println("getHour() = " + now.getHour());
System.out.println("getMinute() = " + now.getMinute());
System.out.println("getSecond() = " + now.getSecond());
System.out.println("getNano() = " + now.getNano());
getHour() = 12
getMinute() = 7
getSecond() = 21
getNano() = 180343000



4. LocalDateTime 연산


Plus


  • LocalDateTime plusYears(long years) - 인자만큼 년도 추가
  • LocalDateTime plusMonths(long months) - 인자만큼 달 추가
  • LocalDateTime plusWeeks(long weeks) - 인자만큼 주 추가
  • LocalDateTime plusDays(long days) - 인자만큼 일 추가
  • LocalDateTime plusHours(long hours) - 인자만큼 시간 추가
  • LocalDateTime plusMinutes(long minutes) - 인자만큼 분 추가
  • LocalDateTime plusSeconds(long seconds) - 인자만큼 초 추가
  • LocalDateTime plusNanos(long nanos) - 인자만큼 나노세컨드 추가
// now: 2021년 9월 9일 10시 0분 0초
LocalDateTime now = LocalDateTime.of(2021, 9, 9, 10, 0, 0);
System.out.println("plusYears(3) = " + now.plusYears(3));
System.out.println("plusMonths(3) = " + now.plusMonths(3));
System.out.println("plusDays(3) = " + now.plusDays(3));
System.out.println("plusHours(3) = " + now.plusHours(3));
System.out.println("plusMinutes(3) = " + now.plusMinutes(3));
System.out.println("plusSeconds(3) = " + now.plusSeconds(3));
plusYears(3) = 2024-09-09T10:00
plusMonths(3) = 2021-12-09T10:00
plusDays(3) = 2021-09-12T10:00
plusHours(3) = 2021-09-09T13:00
plusMinutes(3) = 2021-09-09T10:03
plusSeconds(3) = 2021-09-09T10:00:03


Minus


  • LocalDateTime minusYears(long years) - 인자만큼 년도 감소
  • LocalDateTime minusMonths(long months) - 인자만큼 달 감소
  • LocalDateTime minusDays(long days) - 인자만큼 일 감소
  • LocalDateTime minusWeeks(long weeks) - 인자만큼 주 감소
  • LocalDateTime minusHours(long hours) - 인자만큼 시간 감소
  • LocalDateTime minusMinutes(long minutes) - 인자만큼 분 감소
  • LocalDateTime minusNanos(long nanos) - 인자만큼 나노세컨드 감소
  • LocalDateTime minusSeconds(long seconds) - 인자만큼초 감소

// now: 2021년 9월 9일 10시 0분 0초
LocalDateTime now = LocalDateTime.of(2021, 9, 9, 10, 0, 0);
System.out.println("minusYears(3) = " + now.minusYears(3));
System.out.println("minusMonths(3) = " + now.minusMonths(3));
System.out.println("minusDays(3) = " + now.minusDays(3));
System.out.println("minusHours(3) = " + now.minusHours(3));
System.out.println("minusMinutes(3) = " + now.minusMinutes(3));
System.out.println("minusSeconds(3) = " + now.minusSeconds(3));
minusYears(3) = 2018-09-09T10:00
minusMonths(3) = 2021-06-09T10:00
minusDays(3) = 2021-09-06T10:00
minusHours(3) = 2021-09-09T07:00
minusMinutes(3) = 2021-09-09T09:57
minusSeconds(3) = 2021-09-09T09:59:57



5. LocalDateTime 비교


  • isAfter() - 인자보다 미래 시간이라면 true 반환
  • isBefore() - 인자보다 과거 시간이면 true 반환
  • isEqual() - 인자와 같은 시간이면 true 반환
  • compareTo()
    • compareTo() > 0 : 인자보다 미래 시간
    • compareTo() < 0 : 인자보다 과거 시간
    • compareTo() == : 인자와 같은 시간

// localDateTime1: 2021년 1월 1일 0시 0분 0초
LocalDateTime localDateTime1 = LocalDateTime.of(2021, 1, 1, 0, 0, 0);
// localDateTime2: 2021년 1월 1일 0시 0분 0초
LocalDateTime localDateTime2 = LocalDateTime.of(2021, 1, 1, 0, 0, 0);
// localDateTime3: 2023년 1월 1일 0시 0분 0초
LocalDateTime localDateTime3 = LocalDateTime.of(2023, 1, 1, 0, 0, 0);

if (localDateTime1.isBefore(localDateTime3)) {
    System.out.println("localDateTime1 is before localDateTime3");
}

if (localDateTime3.isAfter(localDateTime1)) {
    System.out.println("localDateTime3 is after localDateTime1");
}

if (localDateTime1.isEqual(localDateTime2)) {
    System.out.println("localDateTime1 is equal to localDateTime2");
}

if (localDateTime1.compareTo(localDateTime2) == 0) {
    System.out.println("localDateTime1 is equal to localDateTime2");
}
localDateTime1 is before localDateTime3
localDateTime3 is after localDateTime1
localDateTime1 is equal to localDateTime2
localDateTime1 is equal to localDateTime2



6. LocalDateTime을 LocalDate로 변환


  • LocalDate toLocalDate() - 시간 단위(시간, 분, 초, 나노세컨드)가 없는 LocalDate로 반환합니다.
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println(localDateTime);
System.out.println(localDateTime.toLocalDate());
2021-11-08T12:42:11.769062
2021-11-08



마치며


본 글에서 사용한 플레이그라운드 코드는 Github. Tistory-Covenant-Code에서 확인할 수 있습니다.


글 작성을 위해서 참고한 글 링크를 남깁니다.