English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Основной учебник Java

Java Управление потоком

Java Массивы

Java Ориентированность на объекты (I)

Java Ориентированность на объекты (II)

Java Ориентированность на объекты (III)

Обработка исключений Java

Java Списки (List)

Java Queue (очередь)

Java Map-сборники

Java Set-сборники

Java Ввод/вывод (I/O)

Java Reader/Writer

Другие темы Java

Java 8 API для работы с датами и временем

Java 8 новые возможности

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).

API локализации даты и времени

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 даты и времени часового пояса

Если мы хотим учитывать часовые пояса, мы можем использовать 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

Java 8 новые возможности