English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Java 8새로운 Date-Time API (JSR 310)을 통해 날짜와 시간의 처리를 강화합니다.
오래된 Java에서 날짜 시간 API는 많은 문제가 있었으며, 중요한 문제는 다음과 같습니다:
비스레드 안전하지 않습니다 − java.util.Date은 비스레드 안전하지 않으며, 모든 날짜 클래스는 변경 가능하며, 이는 Java 날짜 클래스의 가장 큰 문제 중 하나입니다.
설계가 매우 나쁩니다 − Java의 날짜/날짜 클래스의 정의가 일관되지 않으며, java.util과 java.sql 패키지 모두에서 날짜 클래스가 있습니다. 또한, 형식화 및 파싱을 위한 클래스는 java.text 패키지에서 정의되었습니다. java.util.Date은 날짜와 시간을 모두 포함하고 있으며, java.sql.Date는 단지 날짜만 포함하고 있어 java.sql 패키지에 포함되는 것은 불합리합니다. 또한, 이 두 클래스는 같은 이름을 가지고 있으며, 이는 매우 나쁜 설계입니다.
시간대 처리가 복잡합니다 − 날짜 클래스는 국제화를 제공하지 않으며 시간대 지원이 없기 때문에 Java는 java.util.Calendar와 java.util.TimeZone 클래스를 도입했습니다. 그러나 이들은 위의 모든 문제를 가지고 있습니다.
Java 8 에서 java.time 패키지는 많은 새로운 API를 제공합니다. 다음은 두 가지 중요한 API입니다:
Local(로컬) − 날짜 시간 처리를 간소화하고 시간대 문제가 없습니다.
Zoned(시간대) − 지정된 시간대를 통해 날짜 시간을 처리합니다.
새로운 java.time 패키지는 날짜, 시간, 날짜 처리를 모두 포함하고 있습니다./시간, 시간대, 일시(instants), 과정(during) 및 시계(clock)의 연산.
LocalDate/LocalTime 과 LocalDateTime 클래스는 시간대가 필수가 아닌 경우 처리할 수 있습니다. 코드는 다음과 같습니다:
import java.time.LocalDate; import java.time.LocalTime; import java.time.LocalDateTime; import java.time.Month; public class Java8Tester { public static void main(String args[]){ Java8Tester java8tester = new Java8Tester(); java8tester.testLocalDateTime(); } public void testLocalDateTime(){ // 현재 날짜와 시간을 가져오기 LocalDateTime currentTime = LocalDateTime.now(); System.out.println("현재 시간: " + currentTime); LocalDate date1 = currentTime.toLocalDate(); System.out.println("date1: " + date1); Month month = currentTime.getMonth(); int day = currentTime.getDayOfMonth(); int seconds = currentTime.getSecond(); System.out.println("월: " + 월 +", 일: " + 일 +", 초: " + seconds); LocalDateTime date2 = currentTime.withDayOfMonth(10).withYear(2012); System.out.println("date2: " + date2); // 12 december 2014 LocalDate date3 = LocalDate.of(2014, Month.DECEMBER, 12); System.out.println("date3: " + date3); // 22 시간 15 분 LocalTime date4 = LocalTime.of(22, 15); System.out.println("date4: " + date4); // 문자열 해석 LocalTime date5 = LocalTime.parse("20:15:30"); System.out.println("date5: " + date5); } }
위의 스크립트 실행 후, 출력 결과는 다음과 같습니다:
$ javac Java8Tester.java $ java Java8Tester 현재 시간: 2016-04-15T16:55:48.668 date1: 2016-04-15 월: APRIL, 일: 15, 초: 48 date2: 2012-04-10T16:55:48.668 date3: 2014-12-12 date4: 22:15 date5: 20:15:30
如果我们需要考虑到时区,就可以使用时区的日期时间API:
import java.time.ZonedDateTime; import java.time.ZoneId; public class Java8Tester { public static void main(String args[]){ Java8Tester java8tester = new Java8Tester(); java8tester.testZonedDateTime(); } public void testZonedDateTime(){ // 현재 시간 날짜 가져오기 ZonedDateTime date1 = ZonedDateTime.parse("2015-12-03T10:15:30+05:30[Asia/Shanghai]"); System.out.println("date1: " + date1); ZoneId id = ZoneId.of("Europe/Paris"); System.out.println("ZoneId: " + ""); + ); ZoneId currentZone = ZoneId.systemDefault(); System.out.println("현재 시간대: " + ""); + currentZone); } }
위의 스크립트 실행 후, 출력 결과는 다음과 같습니다:
$ javac Java8Tester.java $ java Java8Tester date1: 2015-12-03T10:15:30+08:00[Asia/Shanghai] ZoneId: Europe/Paris 현재 시간대: Asia/Shanghai