[Java][time] LocalDate와 LocalTime 클래스

2022. 6. 16. 16:48JAVA/Language

1. LocalDate와 LocalTime 클래스 : 인스턴스 생성

LocalDate와 LocalTime 클래스는 java.time 패키지의 가장 기본이 되는 클래스입니다.

 

LocalDate와 LocalTime 인스턴스 생성방법 : now(), of(), parse()

LocalDate today = LocalDate.now();
LocalTime now   = LocalTime.now();

LocalDate birthDate = LocalDate.of(1999, 12, 31);
LocalTime birthTime = LocalTime.of(23, 59, 59);
LocalDate birthDate = LocalDate.parse("1999-12-31");
LocalTime birthTime = LocalTime.parse("23:59:59");

 

 

2. LocalDate와 LocalTime 클래스의 특정필드의 값 가져오기 : get(TemporalField), getXXX()

특정 필드의 값을 가져오는 getXXX()

getXXX() 메서드를 사용하여 LocalDate와 LocalTime 인스턴스의 필드의 값을 반환할 수 있습니다.

클래스 메서드 설명(1999-12-31 23:59:59)
LocalDate int getYear() 년도(1999)
int getMonthValue() 월(12)
Month getMonth() 월(DECEMBER), getMonth().getValue() = 12
int getDayOfMonth() 일(31)
int getDayOfYear() 같은 해의 1월 1일부터 몇번째 일(365)
DayOfWeek getDayOfWeek() 요일(FRIDAY) getDayOfWeek().getValue() = 5
int lengthOfMonth() 같은 달의 총 일수 (31)
int lengthOfYear() 같은 해의 총 일수 (365), 윤년이면 366
boolean isLeapYear() 윤년여부 확인 (false)
LocalTime int getHour() 시(23)
int getMinute() 분(59)
int getSecond() 초(59)
int getNano() 나노초(0)

 

TemporalField 인터페이스를 이용한 특정 필드 가져오기 : get(TemporalField), getLong(TemporalField)

get(TemporalField) 메서드를 이용하면 날짜 또는 시간의 단위를 매개변수에 넣어주면 그에 맞는 필드값을 가져옵니다. 표에 나오는 ChronoField 열거형은 TemporalField 인터페이스의 구현입니다.

TemporalField(ChronoField) 설명
ERA 시대
YEAR_OF_EAR, YEAR
MONTH_OF_YEAR
DAY_OF_WEEK 요일(1:월요일, 2:화요일, ..., 7:일요일)
DAY_OF_MONTH
AMPM_OF_DAY 오전/오후
HOUR_OF_DAY 시간(0~23)
CLOCK_HOUR_OF_AMPM 시간(1~12)
MINUTE_OF_HOUR
SECOND_OF_MINUTE
MILLI_OF_SECOND 밀리초(천분의 일초)
MICRO_OF_SECOND 마이크로초(만분의 일초)
NANO_OF_SECOND 나노초(10억분의 일초)
DAY_OF_YEAR 그 해의 몇번째 날

사용할 수 있는 필드는 클래스마다 다릅니다. 예를 들어 LocalDate는 날짜를 표현하기 위한 것이므로, MINUTE_OF_HOUR와 같이 시간에 관련된 필드는 사용할 수 없습니다.

birthDate.get(ChronoField.YEAR);

 

3. LocalDate와 LocalTime 필드의 값 변경하기 : with(), plus(), minus()

with 메서드

날짜와 시간에서 특정 필드 값을 변경하려면, 다음과 같이 with로 시작하는 메서드를 사용하거나 with() 메서드를 사용하여 단위와 값을 설정하여 변경할 수 있습니다.

 

with() 메서드 형식

LocalDate with(TemporalField field, long newValue);

 

with으로 시작하는 메서드들

LocalDate withYear(int year)
LocalDate withMonth(int month)
LocalDate withDayOfMonth(int dayOfMonth)

LocalTime withHour(int hour)
LocalTime withMinute(int minute)
LocalTime withSecond(int second)
LocalTime withNano(int nanoOfSecond)

 

plus 메서드

plus 메서드는 LocalDate 또는 LocalTime 인스턴에 특정한 일자와 시간을 추가하는 메서드입니다.

 

plus() 메서드 형식

LocalTime plus(TemporalAmount amountToAdd)
LocalTime plus(long amountToAdd, TemporalUnit unit)

LocalDate plus(TemporalAmount amountToAdd)
LocalDate plus(long amountToAdd, TemporalUnit unit)

 

plus로 시작하는 메서드들

LocalDate plusYears(long yearsToAdd)
LocalDate plusMonths(long monthsToAdd)
LocalDate plusDays(long daysToAdd)
LocalDate plusWeeks(long weeksToAdd)

LocalTime plusHours(long hoursToAdd)
LocalTime plusMinutes(long minutesToAdd)
LocalTime plusSeconds(long seoncsToAdd)
LocalTime plusNanos(long nanosToAdd)

 

LocalTime.truncatedTo() 메서드

지정된 시간 단위보다 작은 단위의 필드를 0으로 변환시킵니다.

LocalTime time = LocalTime.of(12, 34, 56); // 12시 34분 56초
time = time.truncatedTo(ChronoUnit.HOURS); // 시(hour)보다 작은 단위를 0으로
System.out.println(time);                  // 12:00

 

열거형 ChornoUnit에 정의된 상수 목록

TemporalUnit(ChronoUnit) 설명
FOREVER Long.MAX_VALUE초(약 3천억년)
EARS 1,000,000,000년
MILLENNIA 1,000년
CENTURIES 100년
DECADES 10년
YEARS
MONTHS
WEEKS
DAYS
HALF_DAYS 반나절
HOURS
MINUTES
SECONDS
MILLIS 밀리초(천분의 일초)
MICROS 마이크로초(만분의 일초)
NANOS 나노초(10억분의 일초)

 

4. 날짜와 시간의 비교 : isAter(), isBefore(), isEqual()

메서드 형식

boolean isAfter(ChronoLocalDate other)
boolean isBefore(ChronoLocalDate other)
boolean isEqual(ChornoLocalDate other) - LocalDate에만 존재
  • A.isAfter(B) : A가 B보다 일자 또는 시간이 앞서면 true 반환, 아니면 false 반환
  • A.isBefore(B) : A가 B보다 일자 또는 시간이 느리면 true 반환, 아니면 false 반환
  • A.isEqual(B) : A와 B의 일자가 동일하면 true 반환, 아니면 false 반환

 

5. LocalDate와 LocalTime 클래스의 예제

public class NewTimeEx1 {
	public static void main(String[] args) {
		LocalDate today = LocalDate.now();  // 오늘 날짜
		LocalTime now = LocalTime.now();	// 현재 시간
		
		
		LocalDate birthDate = LocalDate.of(1998, 12, 31);	// 1998년 12월 31일
		LocalTime birthTime = LocalTime.of(23, 59, 59);		// 23시 59분 59초
			
		System.out.println("today=" + today);
		System.out.println("now=" + now);
		System.out.println("birthDate=" + birthDate);
		System.out.println("birthTime=" + birthTime);
		
		System.out.println(birthDate.withYear(2000));			// 2000-12-31
		System.out.println(birthDate.plusDays(1));				// 1999-01-01
		System.out.println(birthDate.plus(1, ChronoUnit.DAYS)); // 1999-01-01
		
		// 23:59:59 -> 23:00
		System.out.println(birthTime.truncatedTo(ChronoUnit.HOURS));
		
		// 특정 ChornoField의 범위를 알아내는 방법
		System.out.println(ChronoField.CLOCK_HOUR_OF_DAY.range()); // 1-24
		System.out.println(ChronoField.HOUR_OF_DAY.range());	   // 0-23
		
		LocalDate date1 = LocalDate.of(2000, 1, 1);
		LocalDate date2 = LocalDate.of(2001, 12, 31);
		
		LocalTime time1 = LocalTime.of(1, 30);
		LocalTime time2 = LocalTime.of(3, 30);
		
		System.out.println("date1.isAfter() : " + date1.isAfter(date2));
		System.out.println("date1.isBefore() : " + date1.isBefore(date2));
		System.out.println("date1.isEqual() : " + date1.isEqual(date2));
		
		System.out.println("time1.isAfter() : " + time1.isAfter(time2));
		System.out.println("time1.isBefore() : " + time1.isBefore(time2));
		
	}
}
today=2022-06-16
now=16:44:05.332444900
birthDate=1998-12-31
birthTime=23:59:59
2000-12-31
1999-01-01
1999-01-01
23:00
1 - 24
0 - 23
date1.isAfter() : false
date1.isBefore() : true
date1.isEqual() : false
time1.isAfter() : false
time1.isBefore() : true

 

References

source code : https://github.com/yonghwankim-dev/java_study/tree/main/ch10
[도서] Java의 정석, 남궁 성 지음