English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Java 8 усилила поддержку работы с датами и временем, выпустив новый API для работы с датами и временем (JSR 310).
В старых версиях Java API для работы с датами и временем имелись множество проблем, среди которых:
Не безопасна для использования в многопоточном контексте java.util.Date не является безопасной для использования в многопоточном контексте, все классы даты и времени в Java являются изменяемыми, это одна из самых больших проблем с классами даты и времени в 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. Вот два из них:
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("месяц: " + month +", день: " + day +", секунды: " + seconds); LocalDateTime date2 = currentTime.withDayOfMonth(10).withYear(2012); System.out.println("date2: " + date2); // 12 декабря 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: " + id); 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