Java는 마침내 날짜와 시간을 처리하는 직관적이고 안정적인 방법을 갖게 되었습니다. 날짜와 시간의 원칙은 많은 응용 프로그램에서 기본입니다. 생년월일, 대여 날짜, 이벤트 시간, 매장 영업 시간 등 다양한 사항은 모두 날짜 및 시간을 기준으로 하지만 Java SE는 이를 처리하는 편리한 방법을 제공하지 않았습니다. Java SE 8 부터 날짜 및 시간 작업을 위한 잘 구조화된 API를 제공하는 java.time 패키지 세트가 있었습니다.
다음은 구현 시 발생하는 문제의 작은 목록입니다.
배경
Java가 처음 출시되었을 때 버전 1.0 에서는 날짜 및 시간 작업을 위한 유일한 클래스는 java.util.Date 였습니다 . 개발자가 가장 먼저 알아차린 것은 "날짜"를 나타내지 않는다는 것입니다. 실제로 이는 1970년 1월 1일부터 측정된 밀리초 단위의 정확한 순간을 나타냅니다. 그러나 Date 의 toString() 메소드가 시스템의 Java 설정 에 지정된 시간대의 날짜와 시간을 표시한다는 사실을 기반으로 일부 개발자는 Date가 시간대와 작동할 수 있다고 잘못 결론을 내렸습니다. 이 클래스를 수정하는 것은 너무 어려운(또는 너무 게으른) 것으로 판명되어 버전 1.1 에서는 새로운 클래스인 java.util.Calendar 를 추가해야 했습니다 . 불행하게도 Calendar 클래스는 Date 클래스 보다 별로 좋지 않은 것으로 나타났습니다 .- 변하기 쉬운. 날짜 및 시간과 같은 클래스는 변경할 수 없어야 합니다.
- 오프셋. 날짜의 연도는 1900년부터 시작하고 두 클래스의 월은 0부터 시작합니다.
- 이름. Date는 실제로 "날짜"가 아니며 Calendar는 달력이 아닙니다.
- 포맷. 형식 지정은 달력이 아닌 날짜에서만 작동하며 스레드로부터 안전하지 않습니다.
검토
새로운 java.time API에는 5개의 패키지가 포함되어 있습니다.- java.time - 값을 저장할 객체가 포함된 기본 패키지
- java.time.chrono - 다양한 달력에 대한 액세스 제공
- java.time.format - 날짜 및 시간 형식 지정 및 인식
- java.time.temporal - 하위 수준 라이브러리 및 고급 기능
- java.time.zone - 시간대 작업을 위한 클래스
날짜
LocalDate 클래스는 새 API 에서 가장 중요한 클래스 중 하나입니다 . 여기에는 날짜를 나타내는 변경할 수 없는 값이 포함되어 있습니다. 시간이나 시간대를 설정할 수 없습니다. "local"이라는 이름은 Joda-Time 에서 익숙할 수 있으며 원래는 ISO-8601 표준 에서 유래되었습니다 . 이는 정확히 시간대가 없다는 것을 의미합니다. 기본적으로 LocalDate는 "2014년 4월 5일"과 같은 날짜에 대한 설명입니다. 이 날짜의 실제 시간은 시간대에 따라 다릅니다. 예를 들어, 호주에서는 이 날짜가 런던보다 10시간 빠르며 샌프란시스코보다 18시간 빠릅니다. LocalDate 클래스 에는 일반적으로 필요한 모든 메서드가 있습니다.LocalDate date = LocalDate.of(2014, Month.JUNE, 10); int year = date.getYear(); // 2014 Month month = date.getMonth(); // Июнь int dom = date.getDayOfMonth(); // 10 DayOfWeek dow = date.getDayOfWeek(); // Вторник int len = date.lengthOfMonth(); // 30 (дней в Июне) boolean leap = date.isLeapYear(); // false (не високосный год)
이 예에서는 팩토리 메서드를 사용하여 생성된 날짜를 볼 수 있습니다(모든 생성자는 비공개입니다). 다음으로 객체에 일부 데이터를 요청합니다.
Month 및
DayOfWeek 열거형은 코드를 더 읽기 쉽고 안정적으로 만들기 위해 설계되었습니다 . 다음 예에서는 날짜를 수정하는 방법을 살펴보겠습니다. 클래스는 불변이므로 결과는 새로운 객체가 되지만 원본 객체는 그대로 유지됩니다.
LocalDate date = LocalDate.of(2014, Month.JUNE, 10); date = date.withYear(2015); // 2015-06-10 date = date.plusMonths(2); // 2015-08-10 date = date.minusDays(1); // 2015-08-09
이는 상대적으로 간단한 변경이지만 더 복잡한 날짜 수정이 필요한 경우가 많습니다.
java.time API 에는 이를 위한 특별한 메커니즘인 TemporalAdjuster가 있습니다 . 그 목적은 날짜를 조작할 수 있는 내장 도구를 제공하는 것입니다. 예를 들어 해당 월의 마지막 날에 해당하는 객체를 가져오는 것입니다.
그 중 일부는 API 에 포함되어 있지만 직접 추가할 수도 있습니다. 수정자를 사용하는 것은 매우 쉽지만 정적 가져오기가 필요합니다.
import static java.time.DayOfWeek.* import static java.time.temporal.TemporalAdjusters.* LocalDate date = LocalDate.of(2014, Month.JUNE, 10); date = date.with(lastDayOfMonth()); date = date.with(nextOrSame(WEDNESDAY));
수정자를 사용하면 코드가 크게 단순화됩니다. 수동으로 날짜를 조작하는 것을 보고 싶어하는 사람은 아무도 없습니다. 프로젝트에서 일종의 날짜 조작이 여러 번 발생하는 경우 고유한 수정자를 작성하면 팀에서 이를 이미 작성되고 테스트된 구성 요소로 사용할 수 있습니다.
GO TO FULL VERSION