날짜와 시간을 나타내는 다양한 객체를 다루는 인터페이스이다.
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을 직접 사용할 수 있다.
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);
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);
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);
날짜, 시간 값을 지정된 형태로 변환한다.
반환값은 문자열이다.
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이다.
사용자가 직접 날짜와 시간의 형태를 정의하는데 사용된다.
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
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)
날짜와 시간 값을 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);
시간 날짜 값에서 원하는 시간 정보를 얻어 낼 수 있는 메서드이다.
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);
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);
두 날짜시간 값을 비교해서 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
해당 월의 일수, 일년의 일수를 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);
입력된 값만큼 뺀 날짜를 출력한다. 반환값은 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);
입력된 값만큼 뺀 날짜를 출력한다. 반환값은 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);
입력된 값을 이용하여 날짜 값을 만든다. 반환 타입은 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);
입력한 년도에 입력한 일수만큼 날짜를 계산해서 반환한다.
반환값은 LocalDate다.
// 2023년도의 365일중 150일째 날짜
LocalDate date = LocalDate.ofYearDay(2023, 150);
// 출력 -> Date: 2023-05-30
System.out.println("Date: " + date);
문자열을 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);
// 문자열 형식이 형태와 맞지 않으면 에러가 난다.
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);
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
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 + "년");
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);
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);
값을 입력하면 메서드에 맞게 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