LocalDate 메서드 정리

·2023년 6월 10일

📌 LocalDate


📖 인터페이스 Temporal

날짜와 시간을 나타내는 다양한 객체를 다루는 인터페이스이다.
Temporal 의 구현 클래스

  • java.time.LocalDate: 날짜를 나타내는 클래스
  • java.time.LocalTime: 시간을 나타내는 클래스
  • java.time.LocalDateTime: 날짜와 시간을 나타내는 클래스
  • java.time.OffsetTime: 시간과 오프셋을 나타내는 클래스
  • java.time.OffsetDateTime: 날짜, 시간, 오프셋을 나타내는 클래스
  • java.time.ZonedDateTime: 날짜, 시간, 시간대를 나타내는 클래스
  • java.time.Instant: UTC 기준의 시점을 나타내는 클래스
  • java.time.Year: 연도를 나타내는 클래스
  • java.time.YearMonth: 연도와 월을 나타내는 클래스
  • java.time.MonthDay: 월과 일을 나타내는 클래스
  • java.time.Period: 날짜 간격을 나타내는 클래스
  • java.time.Duration: 시간 간격을 나타내는 클래스

📖 adjustInto(Temporal temporal)

매개변수의 시간, 날짜 값에 객체의 시간 날짜 값을 전달, 변환한다.
반환 타입은 Temporal 타입이다.


LocalDate localDate = LocalDate.of(2021, 5, 6);
// 현재 날짜값 -> 2022-06-010T18:06:02.267
LocalDateTime localDateTime = LocalDateTime.now();
// localDate 년, 월, 일 -> LocalDateTime에 전달 
Temporal adjustedDateTime = localDate.adjustInto(localDateTime);
// 출력 -> 2021-05-06T18:06:02.267
System.out.println(adjustedDateTime);

만약 매개변수에 변환시킬 값이 없다면 에러가 발생한다.

해당객체는 Temporal을 직접 사용할 수 없고, Temporal을 구현한 객체들만 올 수 있다. 매개변수에는 Temporal을 직접 사용할 수 있다.

📖 atStartOfDay()

LocalDate에 시간값을 0으로 초기화해서 LocalDateTime으로 반환한다.

LocalDate localDate = LocalDate.of(2023, 6, 9);
// 시간을 00:00분으로 초기화해서 LocalDate 값에 추가한다.
LocalDateTime startOfDay = localDate.atStartOfDay();
// 출력 -> 2023-06-09T00:00
System.out.println(startOfDay);

📖 atStartOfDay(ZoneId zone)

LocalDate에 시간값을 0으로 초기화하는 것까지는 같으나, 지역별 시차를 적용시킨다. ZonedDateTime(시차 표현 가능한 DateTime)으로 반환한다.

시차의 기준은 UTC라는 협정세계시 기준이다.

LocalDate localDate = LocalDate.of(2023, 6, 9);
// 지역을 서울로 지정한다.
ZoneId zone = ZoneId.of("Asia/Seoul");
// 출력 -> 2023-06-09T00:00+09:00[Asia/Seoul]
// UTC 보다 9시간 차이가 난다.
ZonedDateTime startOfDay = localDate.atStartOfDay(zone);
System.out.println(startOfDay);
        

📖 atTime(LocalTime time)

LocalDate타입에 Time값을 추가한다. 반환타입은 LocalDateTime이다.

LocalDate date = LocalDate.of(2023, 6, 9);
// 12시 0분
LocalTime time = LocalTime.of(12, 0);
// date + time 	
LocalDateTime dateTime = date.atTime(time);
System.out.println(dateTime);

// 다양한 매개변수

// 변수에 담지 않고 값을 입력해도 상관 없다.
LocalDateTime dateTime = date.atTime(12, 0);
// 시, 분, 초, 나노초 까지 입력 가능하다.
LocalTime time = LocalTime.of(12, 0, 20, 30);

📖 format(DateTimeFormatter formatter)

날짜, 시간 값을 지정된 형태로 변환한다.
반환값은 문자열이다.

LocalDate date = LocalDate.of(2023, 6, 9);
// 지정된 형태로 date 값을 변환한다.
String formattedDate = date.format(DateTimeFormatter.ofPattern("dd/MM/yyyy"));
// 출력 -> 09/06/2023(문자열)
System.out.println(formattedDate);

📖 DateTimeFormatter

날짜와 시간값을 어떤 형태로 출력할지 도와주는 객체이다.
반환값은 DateTimeFormatter이다.

DateTimeFormatter의 주요 메서드

📔 ofPattern

사용자가 직접 날짜와 시간의 형태를 정의하는데 사용된다.

	LocalDate date = LocalDate.of(2023, 6, 9);
	LocalTime time = LocalTime.of(14, 30);
	LocalDateTime dateTime = LocalDateTime.of(date, time);

	DateTimeFormatter formatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd");
	String formattedDate1 = date.format(formatter1);
	System.out.println(formattedDate1);  // 출력: 2023-06-09

	DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("dd/MM/yyyy");
	String formattedDate2 = date.format(formatter2);
	System.out.println(formattedDate2);  // 출력: 09/06/2023

	DateTimeFormatter formatter3 = DateTimeFormatter.ofPattern("HH:mm:ss");
	String formattedTime = time.format(formatter3);
	System.out.println(formattedTime);  // 출력: 14:30:00

	DateTimeFormatter formatter4 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
	String formattedDateTime = dateTime.format(formatter4);
	System.out.println(formattedDateTime);  // 출력: 2023-06-09 14:30:00

날짜 및 시간 패턴 문자(출처 ChatGPT)

y : 연도를 나타냅니다. (예: 2023)
M : 월을 나타냅니다. (M 또는 MM은 1자리 또는 2자리 숫자로 표현, MMM은 축약된 월 이름, MMMM은 전체 월 이름) (예: 6, 06, Jun, June)
d : 일을 나타냅니다. (d 또는 dd은 1자리 또는 2자리 숫자로 표현) (예: 9, 09)
h : 12시간 형식의 시간을 나타냅니다. (h 또는 hh는 1자리 또는 2자리 숫자로 표현) (예: 9, 09)
H : 24시간 형식의 시간을 나타냅니다. (H 또는 HH는 1자리 또는 2자리 숫자로 표현) (예: 9, 09, 18)
m : 분을 나타냅니다. (m 또는 mm은 1자리 또는 2자리 숫자로 표현) (예: 5, 05)
s : 초를 나타냅니다. (s 또는 ss은 1자리 또는 2자리 숫자로 표현) (예: 7, 07)
a : 오전/오후를 나타냅니다. (a는 AM 또는 PM) (예: AM)
E : 요일을 나타냅니다. (E 또는 EE은 요일의 축약형, EEE은 요일의 짧은 이름, EEEE은 요일의 전체 이름) (예: Mon, Monday)
G : 연대를 나타냅니다. (G 또는 GG은 연대의 축약형, GGGG은 연대의 전체 이름) (예: AD)
z : 시간대를 나타냅니다. (예: Pacific Standard Time, PST)
Z : 시간대 오프셋을 나타냅니다. (예: -0800, -08:00, -08, Z)

📔 ofLocalizedDateTime

날짜와 시간 값을 SHORT, MEDIUM, LONG으로 구분해서 LONG쪽으로 갈수록 더욱 더 상세한 값을 표현한다.

		LocalDateTime dateTime = LocalDateTime.of(2023, 6, 9, 14, 30);
		DateTimeFormatter dateTimeFormatter1 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT);
		DateTimeFormatter dateTimeFormatter2 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM);
		DateTimeFormatter dateTimeFormatter3 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG);
		String formattedDateTime1 = dateTime.format(dateTimeFormatter1);
		String formattedDateTime2 = dateTime.format(dateTimeFormatter2);
		String formattedDateTime3 = dateTime.format(dateTimeFormatter3);
        // 출력 -> 23. 6. 9 오후 2:30
		System.out.println(formattedDateTime1); 
        // 2023. 6. 9 오후 2:30:00
		System.out.println(formattedDateTime2); 
        // 2023년 6월 9일 (금) 오후 2시 30분 00초
		System.out.println(formattedDateTime3); 

📖 get(TemporalField field)

시간 날짜 값에서 원하는 시간 정보를 얻어 낼 수 있는 메서드이다.

TemporalField는 시간 기반 필드를 나타내는 인터페이스이다.
예를 들어,
ChronoField는 날짜와 시간의 각 필드를 나타내는 열거형 상수를 제공한다. ChronoField의 일부 예시로는 YEAR, MONTH, DAY_OF_MONTH, DAY_OF_WEEK 등이 있다.

LocalDateTime dateTime = LocalDateTime.of(2023, 6, 9, 15, 30, 0);

int year = dateTime.get(ChronoField.YEAR);
int month = dateTime.get(ChronoField.MONTH_OF_YEAR);
int dayOfMonth = dateTime.get(ChronoField.DAY_OF_MONTH);
int hour = dateTime.get(ChronoField.HOUR_OF_DAY);
int minute = dateTime.get(ChronoField.MINUTE_OF_HOUR);
int second = dateTime.get(ChronoField.SECOND_OF_MINUTE);

// 출력 -> Year: 2023
System.out.println("Year: " + year);
// 출력 -> Month: 6
System.out.println("Month: " + month);
// 출력 -> Day of Month: 9
System.out.println("Day of Month: " + dayOfMonth);
// 출력 -> Hour: 15
System.out.println("Hour: " + hour);
// 출력 -> Minute: 30
System.out.println("Minute: " + minute);
// 출력 -> Second: 0
System.out.println("Second: " + second);

📖 그외 get관련 메서드

		LocalDate date = LocalDate.of(2023, 6, 9);

		Era era = date.getEra();
		int year = date.getYear();
		Month month = date.getMonth();
		int dayOfMonth = date.getDayOfMonth();
		DayOfWeek dayOfWeek = date.getDayOfWeek();
		int dayOfYear = date.getDayOfYear();
		
        // 출력 -> Era: CE (기원 후)
		System.out.println("Era: " + era);
         // 출력 -> Year: 2023
		System.out.println("Year: " + year);
         // 출력 -> Month: JUNE
		System.out.println("Month: " + month);
         // 출력 -> Day of Month: 9
		System.out.println("Day of Month: " + dayOfMonth);
         // 출력 -> Day of Week: FRIDAY
		System.out.println("Day of Week: " + dayOfWeek);
         // 출력 -> Day of Year: 160(365일 중 며칠째인지)
		System.out.println("Day of Year: " + dayOfYear);

📖 isAfter(ChronoLocalDate other), isBefore(ChronoLocalDate other), isEqual(ChronoLocalDate other)

두 날짜시간 값을 비교해서 true, false 값을 반환한다.

LocalDate date1 = LocalDate.of(2023, 6, 9);
LocalDate date2 = LocalDate.of(2023, 6, 10);

boolean isAfter = date1.isAfter(date2);
boolean isBefore = date1.isBefore(date2);
boolean isEqual = date1.isEqual(date2);

System.out.println("isAfter: " + isAfter);      // 출력: isAfter: false
System.out.println("isBefore: " + isBefore);    // 출력: isBefore: true
System.out.println("isEqual: " + isEqual);      // 출력: isEqual: false

📖 lengthOfMonth(), lengthOfYear()

해당 월의 일수, 일년의 일수를 int 타입으로 반환한다.
일년은 윤년이라면 366일이다.

LocalDate date = LocalDate.of(2023, 6, 9);

int lengthOfMonth = date.lengthOfMonth();
int lengthOfYear = date.lengthOfYear();

// 출력 -> Length of Month: 30
System.out.println("Length of Month: " + lengthOfMonth);
// 출력 -> Length of Year: 365
System.out.println("Length of Year: " + lengthOfYear);

📖 minus(long amountToSubtract, TemporalUnit unit), minus(TemporalAmount amountToSubtract)

입력된 값만큼 뺀 날짜를 출력한다. 반환값은 LocalDate 타입이다.

LocalDate date = LocalDate.of(2023, 6, 9);

// 일주일 x2 만큼의 날짜 만큼 date에서 뺀다.
LocalDate subtractedDate1 = date.minus(2, ChronoUnit.WEEKS);
// 출력 -> Subtracted Date 1: 2023-05-26
System.out.println("Subtracted Date 1: " + subtractedDate1);

// 한달 그리고 5일을 date에서 뺀다
Period period = Period.ofMonths(1).plusDays(5);
LocalDate subtractedDate2 = date.minus(period);
// 출력 -> Subtracted Date 2: 2023-05-04
System.out.println("Subtracted Date 2: " + subtractedDate2);

📖 minusDays(long daysToSubtract), minusMonths(long monthsToSubtract), minusWeeks(long weeksToSubtract), minusYears(long yearsToSubtract)

입력된 값만큼 뺀 날짜를 출력한다. 반환값은 LocalDate 타입이다.

LocalDate date = LocalDate.of(2023, 6, 9);

// 10일을 뺌
LocalDate subtractedDate1 = date.minusDays(10);
// 출력 -> 뺀 날짜 1: 2023-05-30
System.out.println("뺀 날짜 1: " + subtractedDate1);

// 2개월을 뺌
LocalDate subtractedDate2 = date.minusMonths(2);
// 출력 -> 뺀 날짜 2: 2023-04-09
System.out.println("뺀 날짜 2: " + subtractedDate2);

// 3주를 뺌
LocalDate subtractedDate3 = date.minusWeeks(3);
// 출력 -> 뺀 날짜 3: 2023-05-19
System.out.println("뺀 날짜 3: " + subtractedDate3);

// 1년을 뺌
LocalDate subtractedDate4 = date.minusYears(1);
// 뺀 날짜 4: 2022-06-09
System.out.println("뺀 날짜 4: " + subtractedDate4);

📖 of(int year, int month, int dayOfMonth), of(int year, Month month, int dayOfMonth)

입력된 값을 이용하여 날짜 값을 만든다. 반환 타입은 LocalDate 타입이다.

// int 형식의 월을 사용하는 of 메서드 예시
LocalDate date1 = LocalDate.of(2023, 6, 9);
// 출력 -> Date 1: 2023-06-09
System.out.println("Date 1: " + date1);

// Month 열거형을 사용하는 of 메서드 예시
LocalDate date2 = LocalDate.of(2023, Month.JUNE, 9);
// 출력 -> Date 2: 2023-06-09
System.out.println("Date 2: " + date2);

📖 ofYearDay(int year, int dayOfYear)

입력한 년도에 입력한 일수만큼 날짜를 계산해서 반환한다.
반환값은 LocalDate다.

// 2023년도의 365일중 150일째 날짜
LocalDate date = LocalDate.ofYearDay(2023, 150);
// 출력 -> Date: 2023-05-30
System.out.println("Date: " + date);

📖 parse(CharSequence text), parse(CharSequence text, DateTimeFormatter formatter)

문자열을 LocalDate 타입으로 변환하는 메서드이다.

String dateString1 = "2023-06-09";
// date 타입의 기본 형태인 yyyy-MM-dd로 변환한다.
LocalDate date1 = LocalDate.parse(dateString1);
// 출력 -> Subtracted Date 1: 2023-05-26
System.out.println("Parsed Date1: " + date1);

String dateString2 = "09/06/2023";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
// dd/MM/YYYY 형태로 변환한다. 
LocalDate date2 = LocalDate.parse(dateString2, formatter);
// 출력 -> Subtracted Date 2: 2023-05-04
System.out.println("Parsed Date: " + date2);

// 문자열 형식이 형태와 맞지 않으면 에러가 난다.

📖 plus(long amountToAdd, TemporalUnit unit)

minus와 형태와 사용법이 동일하다.

LocalDate date = LocalDate.of(2023, 6, 9);

// plusDays
LocalDate addedDays = date.plusDays(7);
// 출력 -> Added Days: 2023-06-16
System.out.println("Added Days: " + addedDays);

// plusMonths
LocalDate addedMonths = date.plusMonths(1);
// 출력 -> Added Months: 2023-07-09
System.out.println("Added Months: " + addedMonths);

// plusWeeks
LocalDate addedWeeks = date.plusWeeks(2);
// 출력 -> Added Weeks: 2023-06-23
System.out.println("Added Weeks: " + addedWeeks);

// plusYears
LocalDate addedYears = date.plusYears(5);
// 출력 -> Added Years: 2028-06-09
System.out.println("Added Years: " + addedYears);


📖 query(TemporalQuery query)

TemporalQueries 클래스의 메서드가 날짜/시간 유형의 정보를 가져온다
각 객체를 이용해서 원하는 값을 얻어낼 수 있다.

chronology(): Chronology 객체를 쿼리하여 달력 시스템 정보를 가져온다.
localDate(): LocalDate 객체를 쿼리하여 날짜 정보를 가져온다.
localTime(): LocalTime 객체를 쿼리하여 시간 정보를 가져온다.
offset(): ZoneOffset 객체를 쿼리하여 시간대 오프셋 정보를 가져온다.
precision(): TemporalUnit 객체를 쿼리하여 정밀도 정보를 가져온다.
zone(): ZoneId 객체를 쿼리하여 시간대 정보를 가져온다.
zoneId(): ZoneId 객체를 쿼리하여 시간대 정보를 가져온다.
zoneOffset(): ZoneOffset 객체를 쿼리하여 시간대 오프셋 정보를 가져온다.


        LocalDate queriedDate = date.query(TemporalQueries.localDate());
        System.out.println("Queried Date: " + queriedDate);

        LocalTime queriedTime = date.query(TemporalQueries.localTime());
        System.out.println("Queried Time: " + queriedTime);

        ZoneOffset offset = date.query(TemporalQueries.offset());
        System.out.println("Offset: " + offset);

        TemporalUnit precision = date.query(TemporalQueries.precision());
        System.out.println("Precision: " + precision);

        System.out.println("Zone: " + zone);


        ZoneOffset zoneOffset = date.query(TemporalQueries.zoneOffset());
        System.out.println("Zone Offset: " + zoneOffset);
    }
}
// 출력
Chronology: ISO
Queried Date: 2023-06-09
Queried Time: null
Offset: null
Precision: Days
Zone: null
Zone Id: null
Zone Offset: null

📖 until(Temporal endExclusive, TemporalUnit unit)

endExclusive와 비교 대상인 날짜의 차이를 unit 단위로 보여준다.
반환 타입은 Long이다.

  		LocalDate startDate = LocalDate.of(2023, 6, 1);
        LocalDate endDate = LocalDate.of(2024, 7, 15);

        long daysBetween = startDate.until(endDate, ChronoUnit.DAYS);
        long monthsBetween = startDate.until(endDate, ChronoUnit.MONTHS);
        long yearsBetween = startDate.until(endDate, ChronoUnit.YEARS);
		
  		// 출력 -> 일 수 차이: 409일
        System.out.println("일 수 차이: " + daysBetween + "일");
  		// 출력 -> 월 수 차이: 13개월
        System.out.println("월 수 차이: " + monthsBetween + "개월");
   		// 출력 -> 년 수 차이: 1년
        System.out.println("년 수 차이: " + yearsBetween + "년");


📖 with(TemporalAdjuster adjuster),

TemporalAdjuster를 사용하여 날짜를 새로운 값으로 변환시킨다.

firstDayOfMonth(): 현재 월의 첫 번째 날짜를 반환한다.
lastDayOfMonth(): 현재 월의 마지막 날짜를 반환한다.
firstDayOfNextMonth(): 다음 달의 첫 번째 날짜를 반환한다.
firstDayOfYear(): 현재 연도의 첫 번째 날짜를 반환한다.
lastDayOfYear(): 현재 연도의 마지막 날짜를 반환한다.
firstDayOfNextYear(): 다음 연도의 첫 번째 날짜를 반환힌다.
dayOfWeekInMonth(int ordinal, DayOfWeek dayOfWeek): 현재 월에서 지정된 요일과 일치하는 주의 n번째 요일을 반환한다.
next(DayOfWeek dayOfWeek): 다음 지정된 요일을 반환한다.
previous(DayOfWeek dayOfWeek): 이전 지정된 요일을 반환한다.

  	LocalDate currentDate = LocalDate.now();
	LocalDate nextMonthFirstDay = 	currentDate.with(TemporalAdjusters.firstDayOfNextMonth());
  	// 출력 -> 다음 달의 첫 번째 날: 2023-07-01 
	System.out.println("다음 달의 첫 번째 날: " + nextMonthFirstDay);


📖 with(TemporalField field, long newValue)

TemporalField field를 정한 뒤 newValue 값을 입력하면 date의 값이 변환된다.

// 2023-06-10
LocalDate currentDate = LocalDate.now();
LocalDate modifiedDate = currentDate.with(ChronoField.YEAR, 2024);
// 출력 -> 변경된 날짜: 2024-06-10
System.out.println("변경된 날짜: " + modifiedDate);

📖 그외의 with 메서드들

값을 입력하면 메서드에 맞게 date의 값이 변환된다.

        LocalDate date = LocalDate.of(2023, 6, 9);

        LocalDate withDayOfMonth = date.withDayOfMonth(15);
        LocalDate withDayOfYear = date.withDayOfYear(200);
        LocalDate withMonth = date.withMonth(12);
        LocalDate withYear = date.withYear(2024);
		
  		// 출력 With Day of Month: 2023-06-15
        System.out.println("With Day of Month: " + withDayOfMonth);
  		// With Day of Year: 2023-07-19
        System.out.println("With Day of Year: " + withDayOfYear);
  		// With Month: 2023-12-09
        System.out.println("With Month: " + withMonth);
  		// With Year: 2024-06-09
        System.out.println("With Year: " + withYear);

출처: java 공식 문서 , ChatGPT

profile
개발자가 되기 위해 페달을 밟아가는 과정

0개의 댓글