티스토리 뷰
LocalDate
시간을 제외한 날짜를 표현하는 불변 객체
LocalDate date = LocalDate.of(2023,10,18); //2023-10-18
int year = date.getYear();
Month month = date.getMonth();
int day = date.getDayOfMonth();
DayOfWeek dow = date.getDayOfWeek(); //WEDNESDAY
int len = date.lengthOfMonth(); //31 (10월의 일수)
boolean leap = date.isLeapYear(); //false (윤년)
TemporalField
시간 관련 객체에서 어떤 필드의 값에 접근할지 정의하는 인터페이스
ChronoField는 TemporalField 인터페이스를 정의한 열거 타입
int year = date.get(ChronoField.YEAR);
int month = date.get(ChronoField.MONTH_OF_YEAR);
int day = date.get(ChronoField.DAY_OF_MONTH);
LocalTime
시간을 표현하는 불변 객체
LocalTime time = LocalTime.of(13,45,20); //13:45:20
int hour = time.getHour();
int minute = time.getMinute();
int second = time.getSecond();
parse 정적 메서드
parse 메서드에 DateTimeFormatter를 전달 할 수 있음
파싱할 수 없을 때 DateTimeParseException 발생
LocalDate date2 = LocalDate.parse("2023-10-18");
LocalTime time2 = LocalTime.parse("13:45:20");
LocalDateTime
LocalDate 와 LocalTime을 쌍으로 갖는 복합 클래스
LocalDateTime dt1 = LocalDateTime.of(2023, Month.OCTOBER, 18, 13, 45, 20);
LocalDateTime dt2 = LocalDateTime.of(date, time);
LocalDateTime dt3 = date.atTime(13, 45, 20);
LocalDateTime dt4 = date.atTime(time);
LocalDateTime dt5 = time.atDate(date);
LocalDate date3 = dt1.toLocalDate();
LocalTime time3 = dt1.toLocalTime();
Instant 클래스
기계적인 관점에서 시간을 표현
Unix epoch time (1970년 1월 1일 0시 0분 0초 UTC)을 기준으로 특정 지점까지의 시간을 초로 표현
팩토리 메서드 ofEpochSecond 에 초를 넘겨서 Instant 클래스를 생성
두번째 인수로 나노초 단위로 시간을 보정
Instant.ofEpochSecond(3);
Instant.ofEpochSecond(3, 0);
Instant.ofEpochSecond(2, 1_000_000_000);
Instant.ofEpochSecond(4, -1_000_000_000);
Duration, Period
Duration 클래스의 정적 팩토리 메서드 between 으로 두 시간 객체 사이의 지속시간을 만든다
Duration 클래스는 초와 나노초로 시간 단위를 표현하므로 LocalTime, LocalDateTime, Instant 사용
년, 월, 일로 시간을 표현할 때는 Period 클래스의 between 메서드 사용
Duration d1 = Duration.between(time2, time3);
Duration d2 = Duration.between(dt1, dt2);
Duration d3 = Duration.between(instant1, instant2);
Period p1 = Period.between(date2, date3);
Duration threeMinutes = Duration.ofMinutes(3);
Duration threeMinutes2 = Duration.of(3, ChronoUnit.MINUTES);
Period tenDays = Period.ofDays(10);
Period threeWeeks = Period.ofWeeks(3);
Period twoYearsSixMonthsOneDay = Period.of(2,6,1);
날짜 조정, 파싱, 포멧팅
with 메서드로 기존의 LocalDate를 바꾼 버전을 직접 만든다
바뀐 속성을 포함하는 새로운 객체를 반환
Temoral 객체가 지정된 필드를 지원하지 않으면 UnsupportedTemporalTypeException 발생
LocalDate date4 = date.withYear(2011);
LocalDate date5 = date.withDayOfMonth(25);
LocalDate date6 = date.with(ChronoField.MONTH_OF_YEAR, 2);
plus, minus 메서드는 Temporal 인터페이스에 정의되어 있다
TemporalUnit 인터페이스를 활용할 수 있는 ChronoUnit 열거형을 이용
LocalDate date1 = LocalDate.of(2023,10,22);
LocalDate date2 = date1.plusWeek(1); //2023-10-29
LocalDate date3 = date2.minusYears(5); //2018-10-29
LocalDate date4 = date3.plus(6, ChronoUnit.MONTHS); //2019-04-29
TemporalAdjusters
다음주 일요일, 돌아오는 평일, 어떤 달의 마지막 날 등 복잡한 날짜 조정 기능이 필요할 때 사용
TemporalAdjuster 는 인터페이스 (함수형 인터페이스)
TemporalAdjusters 는 여러 TemporalAdjuster를 반환하는 정적 팩토리 메서드를 포함하는 클래스
LocalDate date1 = LocalDate.of(2023,10,22);
LocalDate date2 = date1.with(nextOrSame(DayOfWeek.SUNDAY)); //현재 날짜 이후 지정한 요일이 나타나는 날짜
LocalDate date3 = date2.with(lastDayOfMonth()); //현재 달의 마지막 날짜를 반환
필요한 기능이 정의되어 있지 않을 때는 커스텀 TemporalAdjuster 구현 생성 가능
TemporalAdjuster를 람다 표현식으로 정의하고 싶으면 UnaryOperator<LocalDate>를 인수로 받는
TemporalAdjusters 클래스의 정적 팩토리 메서드 ofDateAdjuster를 사용
DateTimeFormatter
java.util.DateFormatter -> java.time.formate 새로 추가
날짜나 시간을 특정 형식의 문자열로 만들 수 있음
팩토리 메서드 parse를 이용해서 문자열을 날짜 객체로 만들 수 있음
format 메서드는 요청 형식의 패턴에 해당하는 문자열을 생성
LocalDate date = LocalDate.of(2023,3,18);
String s1 = date.format(DateTimeFormatter.BASIC_ISO_DATE); //20230318
String s2 = date.format(DateTimeFormatter.ISO_LOCAL_DATE); //2023-03-18
LocalDate date1 = LocalDate.parse("20230318", DateTimeFormatter.BASIC_ISO_DATE);
LocalDate date2 = LocalDate.parse("2023-03-18", DateTimeFormatter.ISO_LOCAL_DATE);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
LocalDate date1 = LocalDate.of(2023,03,18);
String formattedDate = date1.format(formatter);
LocalDate date2 = LocalDate.parse(formattedDate, formatter);
'Java' 카테고리의 다른 글
[Java] Executor (0) | 2023.11.20 |
---|---|
[Java] EnumSet, EnumMap (0) | 2023.10.29 |
[Java] Lambda 표현식으로 리펙토링 (1) | 2023.10.12 |
[Java] Lombok @Getter boolean 변수명 주의할 점 (0) | 2023.09.26 |
[Java] ConcurrentHashMap (0) | 2023.09.13 |