LocalDateTime 시간 변경 - LocalDateTime sigan byeongyeong

LocalDate

import할 패키지명

import java.time.LocalDate;

사용 예

LocalDate currentDate = LocalDate.now();
// 현재 날짜가 넣어진 LocalDate 객체 리턴(예: 2020-12-10)

LocalDate startDate = LocalDate.of(2020,12,9);
// of 메소드의 파라미터로 넘어간 값에 따라 날짜 저장된 LocalDate 객체 리턴

LocalDate 자료형 타입 변환

LocalDate → String (YYYYMMdd)

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

LocalDate  String (원하는 형식 - 예: yyyy-MM-dd)

LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));

LocalDate → LocatDateTime

LocalDate.now().atTime(11,34);

LocalTime

import할 패키지명

import java.time.LocalTime;

사용 예

LocalTime currentTime = LocalTime.now();
// 현재 시간이 넣어진 LocalTime 객체 리턴(예: 23:21:30)

LocalTime startTime = LocalTime.of(20,10,9);
// of 메소드의 파라미터로 넘어간 값에 따라 시간이 저장된 LocalTime 객체 리턴
// 이때, 파라미터가 4개가 넘어가야 하지만 마지막 자리가 ns라 따로 넘기지 않으면 0ns로 들어감

LocalDateTime

import할 패키지명

import java.time.LocalDateTime;

사용 예

LocalDateTime currentDateTime = LocalDateTime.now();
// 현재 날짜와 시간이 넣어진 LocalDateTime 객체 리턴(예: 2020-12-10T23:22:20.120)

LocalDateTime startDateTime = LocalDate.of(2020,12,9,12,2,00);
// of 메소드의 파라미터로 넘어간 값에 따라 날짜 및 시간 저장된 LocalDateTime 객체 리턴
// 이 메소드 또한 ns는 넘기지 않아도 됨

LocalDateTime 자료형 타입 변환

DateTime 포맷 변경

import java.time.format.DateTimeFormatter;
// DateTimeFormatter 사용을 위해 import 해야 할 패키지

LocalDateTime now = LocalDateTime.of(2020,12,10,23,30,20);

DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String nowDateTime = now.format(dateTimeFormatter);
// 형식 예: 2020-12-10 23:30:20

DateTimeFormatter dateTimeFormatter2 = DateTimeFormatter.ofPattern("yyyy년 M월 d일 a h시 m분 s초");
String nowDateTime2 = now.format(dateTimeFormatter2);
// 형식 예: 2020년 12월 10일 PM 11시 30분 20초

LocalDateTime → String(YYYY-MM-dd HH:mm:ss)

LocalDateTime.of(2020,12,10,13,41,30).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));

LocalDateTime → LocalDate

LocalDate.from(LocalDateTime.of(2020,12,10,23,35,20));

시간 차이 계산

LocalDateTime startDateTime = LocalDateTime.of(2020,12,9,23,30,20);
// System.out.println(startDateTime) 결과: 2020-12-09T23:30:20

LocalDateTime endDateTime = LocalDateTime.now();
// System.out.println(endDateTime) 결과: 2020-12-10T14:20:56.695433

Duration duration = Duration.between(startDateTime, endDateTime);
duration.getSeconds();
// System.out.println(duration.getSeconds()) 결과: 53436

DateTime 더하기

  • 빼기는 plus 대신 minus* 사용하면 됩니다.
  • LocalDate 객체 또는 LocalTime 객체에서도 사용 가능합니다(물론, time 값 증가를 LocalDate에 쓰는 것은 의미 없음).
Return Type Method Description
java.time.LocalDateTime plusYears(long yearsToAdd) 년도 더하기
java.time.LocalDateTime plusMonths(long MonthsToAdd) 월 더하기
java.time.LocalDateTime plusWeeks(long WeeksToAdd) 주 더하기
java.time.LocalDateTime plusDays(long DaysToAdd) 일 더하기
java.time.LocalDateTime plusHours(long HoursToAdd) 시간 더하기
java.time.LocalDateTime plusMinutes(long MinutesToAdd) 분 더하기
java.time.LocalDateTime plusSeconds(long SecondsToAdd) 초 더하기
java.time.LocalDateTime plusNanos(long NanosToAdd) 나노초 더하기

Time 변경하기

  • LocalTime, LocalDateTime의 경우 with* 메소드를 사용하여 시간을 변경할 수 있습니다.
LocalDateTime now = LocalDateTime.now();
now.withHour(2); // 2시로 변경
now.withMinute(30); // 30분으로 변경
now.withSecond(32); // 32초로 변경
now.withNano(20); // 20나노초로 변경

//LocalDateTime객체.withHour(int hour)
//LocalDateTime객체.withMinute(int minute)
//LocalDateTime객체.withSecond(int second)
//LocalDateTime객체.withNano(int nano)

사실 Date 클래스들의 경우 검색을 해서 사용하는 경우가 대부분이다.

그렇지만 날짜 관련 클래스의 사용빈도는 의외로 많이 있었다.

게임쪽을 예를 들면 타임어택과 같은 컨셉이나 이벤트성 미션

그리고 현금성류의 할인등등에 마찬가지로 쓰이는 클래스라고 할 수 있다.

최근에 날짜 클래스를 다루기도 했고 간단하게 LocalDateTime 과 String 타입 데이터를

서로 변환하는 방법에 대해서 써보려고 함.

1. LocalDate 클래스들의 현재시간 구하기

// Test Class

private final LocalDateTime localDateTimeNow = LocalDateTime.now();
    private final LocalDate localDateNow = LocalDate.now();
    private final LocalTime localTimeNow = LocalTime.now();

    @DisplayName("현재시간 구하기")
    @Test
    public void 현재_시간_구하기() {
        // Bad Test Code
        System.out.println("LocalDateTime 현재시간 : " + localDateTimeNow);
        System.out.println("localDateNow 현재시간 : " + localDateNow);
        System.out.println("localTimeNow 현재시간 : " + localTimeNow);
    }
// 결과
LocalDateTime 현재시간 : 2021-08-01T16:26:39.098
localDateNow 현재시간 : 2021-08-01
localTimeNow 현재시간 : 16:26:39.098

보통의 테스트 코드의 경우 저렇게 로그를 찍는 형식으로 하지 않는다 

하지만 간단하게 결과값을 보기 위해서 사용했고.

간단하게 만들었지만 now() 메서드의 경우 현재시간을 보여주는 메서드로 알고있을텐데

날짜 데이터를 위처럼 받아서 하지 않고 직접 메서드를 호출해서 사용할 경우

미미하게 시간이 다를 수 있기 떄문에 주의해야한다.

따라서 변수에 저장해서 사용해야함.

2. LocalDateTime -> String

LocalDateTime.now() 는 toString()을 통해서 String으로 변환할 수 있다.

하지만, 우리가 원하는 것은 이게 아니다..

@DisplayName("LocalDateTime.now().toString()")
@Test
public void LocalDateTime_now_toString_테스트() {
	
    // LocalDateTime.now().toString()
	System.out.println(localDateTimeNow.toString());
	
}
// 결과
2021-08-01T17:07:49.107

대부분 우리의 목적은 yyyy-MM-dd HH:mm:ss 형식의 데이터를 DB에 넣는 것인데

위와 같은 형식은 목적에 맞지 않다. 게다가 혼난다..

따라서 파싱을 통해 변경해야한다.

 @DisplayName("yyyy-MM-dd HH:mm:ss으로 시간 표시형식 파싱")
    @Test
    public void 표시형식_변경() {
        // yyyy-MM-dd HH:mm:ss 형식으로 변경하기
        String parsedLocalDateTimeNow = localDateTimeNow.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
        System.out.println("기존의 LocalDateTimeNow : " + localDateTimeNow);
        System.out.println("변경된 LocalDateTimeNow : " + parsedLocalDateTimeNow);
    }
// 결과
기존의 LocalDateTimeNow : 2021-08-01T17:09:44.178
변경된 LocalDateTimeNow : 2021-08-01 17:09:44

우리가 원하는 데이터를 얻어왔다.

위와 같은 데이터 형식은 DB에 넣을 때 뿐만 아니라 Timstamp 혹은 Unix Timestamp를 구할때 

사용된다.  'T' 가 붙은 형식을 String 타입으로 변경해서 쓰는 것은 의미도 없고 예외만 발생한다.

3. String -> LocalDateTime

String 타입의 날짜를 다시 LocalDateTime 타입으로 바꾸는 이유는 여러가지가 있을 수 있겠지만

대표적인 예시로는 시간계산을 할 경우 에 사용된다.

보통 시간계산을 할 때 60초가 넘어서 Minute를 변경해야 하고

24시 00분이 되었을 때 처럼 Day를 변경을 해야하는데 까다롭기 때문에 자바에서는 좀더 쉽게 시간계산을 할 수 있게 메서드를 제공을 해준다.  그때 LocalDateTime 타입으로 변경을 해야 시간계산이 가능하기 떄문에 

해당 타입으로 변경을 한다.

    @DisplayName("yyyy-MM-dd HH:mm:ss 형식의 타입변경(LocalDateTime)")
    @Test
    public void LocalDateTime_으로_다시_변경() {
        String parsedLocalDateTimeNow = localDateTimeNow.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
        LocalDateTime formatLocalDateTimeNow =
                LocalDateTime.parse(parsedLocalDateTimeNow, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
         
        System.out.println("String to LocalDatetime : " + formatLocalDateTimeNow);

    }
// 결과
String to LocalDatetime : 2021-08-01T17:17:22