Java 8 Дата и время API

В Java 8 представлен новый Date Time API на основе IS0-8601 стандартов даты и времени.  Date Time API использует календарную систему, определенную в ISO-8601 в качестве календаря по умолчанию. Этот календарь основан на системе Григорианского календаря.  Date-Time API использует Unicode Common Locale Data Repository (CLDR) для данных локали.

Date-Time API использует базу данных часовых поясов (TZDB) для получения информации о часовом поясе.

Методы в API корректно определены в Date-Time API, обеспечивает интуитивный интерфейс, который делает код легко читаемым. Вызовы методов могут быть соединены друг с другом. Например, мы можем использовать следующий код для создания новой даты.

LocalDate allDay = LocalDate.now().with(TemporalAdjusters.lastDayOfMonth()).minusDays(0);

Если вывести в консоль значения переменной allDay результатом работы программы будет информация, о том какой год, какой месяц и сколько дней в месяце.

Java Date-Time API состоит в основном из неизменяемых классов. После того, как объект создан, он не может быть изменен. Для того, чтобы изменить его значение, новый объект должен быть создан в качестве модифицированной копии оригинала.

Date-Time API потокобезопасно.

Методы , используемые для создания даты или времени объекты начинаются of, from, и with , а не конструкторами. Там нет набора методов. Например:

LocalDate allDay = LocalDate.of(2016, Month.MARCH, 18);

Java Date-Time API имеет отдельный набор классов, чтобы иметь дело с машинным временем и календарем на основе человеческого времени.

Дата-Время Пакеты

Java Date-Time API состоит из основного пакета, java.time и четырех подпакетов:

  • java.time содержит ядро API для представления даты и времени. Она включает в себя классы для даты, времени, даты и времени вместе взятых, часовых поясов, моменты времени , продолжительности и часы. LocalDate, LocalTime, LocalDateTime, ZonedDateTime, период, продолжительность и мгновенные классы в этом пакете. Классы в этом пакете основаны на ISO-8601 стандартах.
  • java.time.chrono содержит API для представления календаря, в отличии от того, что по умолчанию ISO-8601 в системмах. Например, Hijrah календарь, календарь ThaiBuddhist и т.д.
  • java.time.format содержит классы для форматирования парсинга даты и времени.
  • java.time.temporal содержит API позволяет совместимые операции между датой и временем классов, выполнения запросов и регулировки. Например, TemporalField и ChronoField и TemporalUnit и ChronoUnit.
  • java.time.zone содержит классы , которые поддерживают часовых поясов, смещения от часовых поясов, а также правила часовых поясов. Например, ZonedDateTime и ZoneId или ZoneOffset.

Названия методов в Java Date-Time API выполнены в соответствии с классами.

Например, метод now();  возвращает значения даты или времени на текущий момент. from(); метод позволяет преобразование из одного класса в другой.

В следующей таблице перечислены наиболее часто используемые префиксы методов:

  • of
    статический метод, который позволяет создать экземпляр ANDS проверки входных параметров
  • from
    статический метод который, преобразует входные параметры в экземпляр целевого класса.
  • parse
    статический метод, позволяет анализировать входную строку для создания экземпляра целевого класса.
  • format
    метод экземпляра, позволяет форматировать временный объект для получения строки.
  • get
    метод экземпляра, возвращает часть целевого объекта.
  • is
    метод экземпляра, запрашивает целевой объект.
  • with
    метод экземпляра, возвращает копию целевого объекта с одним элементом изменения.
  • plus
    метод экземпляра, возвращает копию объекта с количеством времени , с добавленнием.
  • minus
    метод экземпляра возвращает копию объекта с количеством времени , с вычитанием.
  • to
    метод экземпляра, преобразует этот объект в другой тип.
  • at
    метод экземпляра, объединяет этот объект с другим объектом.

Методы of()

Java Date-Time API  используются методы создания объектов.

Следующий код показывает, как создавать объекты класса LocalDate:

package test;

import java.time.Clock;
import java.time.LocalDate;
import java.time.Month;
//nookery.ru
public class Test {
  public static void main(String[] args) {
    LocalDate Date1  = LocalDate.of(2016, 12, 31); 
    System.out.println(Date1);
    
    LocalDate Date2  = LocalDate.of(2016, Month.MARCH, 18);
    System.out.println(Date2);
    
    LocalDate Date3  = LocalDate.ofEpochDay(2016);
    System.out.println(Date3);
    
    LocalDate Date4  = LocalDate.ofYearDay(2016, 31);
    System.out.println(Date4);
          
  }
}

Результатом работы программы будет:

2016-12-31
2016-03-18
1975-07-10
2016-01-31

Метод from()

from()статический метод, который используется для получения объекта типа DateTime , из указанного аргумента.

В отличие от of(), from() требует преобразования данных на указанный аргумент.

Следующий код показывает, как вывести LocalDate из LocalDateTime:

public class Test {
  public static void main(String[] args) {
    LocalDateTime  LocDate = LocalDateTime.of(2016, 3,  18,  23, 30);
    System.out.println(LocDate);
    
    LocalDate Date  = LocalDate.from(LocDate);
    System.out.println(Date);
  }
}

Результатом работы программы будет:2016-03-18T23:30
2016-03-18

Метод with()

Для изменения поля в объекте даты и времени мы можем использовать метод с префиксом with

with() метод возвращает копию объекта с указанным полем изменения, так как большинство объектов в Date Time API неизменны.

Следующий код показывает, как получить LocalDate из другого LocalDate с изменением года:

import java.time.LocalDate;
import java.time.Month;

public class Test {
  public static void main(String[] args) {
    LocalDate locDate1  = LocalDate.of(2016, Month.MARCH,  18);
    System.out.println(locDate1);
    
    //меняем месяц
    LocalDate locDate2  = locDate1.withYear(2015);
    System.out.println(locDate2);
    
    //меняем год и месяц
    LocalDate locDate3  = locDate1.withYear(2014).withMonth(10);
    System.out.println(locDate3);
    
  }
}

Результатом выполнения программы будет:

2016-03-18
2015-03-18
2014-10-18

Метод get()

get()возвращает указанный элемент объекта.

Следующий код показывает , как получить год, месяц, день от LocalDate объекта:

//nookery.ru
import java.time.LocalDate;
import java.time.Month;

public class Test {
  public static void main(String[] args) {
    LocalDate locDate = LocalDate.of(2018, 03, 19);
    int year = locDate.getYear();
    System.out.println(year);
    Month month = locDate.getMonth();
    System.out.println(month);

    int day = locDate.getDayOfMonth();
    System.out.println(day);

  }
}

Результатом работы программы будет:

2018
MARCH
19

Метод to()

to() преобразует объект в соответствующий тип.

Следующий код показывает некоторые примеры использования метода to().

//nookery.ru
import java.time.LocalDate;

public class Test {
  public static void main(String[] args) {
    LocalDate locDate = LocalDate.of(2016, 3, 18); 
    long days = locDate.toEpochDay(); 
    System.out.println(days);

  }
}

Результатом работы программы будет: 16878

Метод at()

at() создает новый объект даты и времени из существующего объекта даты и времени с дополнительной информацией.

Рассмотрим следующий пример использования кода в методе, чтобы добавить дополнительную информацию для объекта даты.

//nookery.ru
import java.time.LocalDate;
import java.time.LocalDateTime;

public class Test {
  public static void main(String[] args) {
    LocalDate locDate  = LocalDate.of(2016, 3, 18);
    System.out.println(locDate);

    LocalDateTime  locTime = locDate.atStartOfDay();
    System.out.println(locTime);

    LocalDateTime  locTime2 = locDate.atTime(10, 20);
    System.out.println(locTime2);
  }
}

Результатом работы программу будет:

2016-03-18
2016-03-18T00:00
2016-03-18T10:20

Метод plus()

plus() возвращает копию объекта путем добавления заданного значения.

Следующий код показывает, как использовать метод плюс, чтобы добавить больше времени для локального объекта даты.

//nookery.ru
import java.time.LocalDate;

public class Test {
  public static void main(String[] args) {
    LocalDate locDate  = LocalDate.of(2018, 3, 18); 
    LocalDate locDate1  = locDate.plusDays(7);   
    System.out.println(locDate1);
    LocalDate locDate2  = locDate.plusMonths(2);
    System.out.println(locDate2);
    LocalDate locDate3  = locDate.plusWeeks(4);        
    System.out.println(locDate3);
  }
}

Результатом работы программы будет:

2018-03-25
2018-05-18
2018-04-15

Метод minus()

minus() возвращает копию объекта путем вычитания заданного значения.

Следующий код показывает, как вычесть время из локального объекта даты.

//nookery.ru
import java.time.LocalDate;

public class Test {
  public static void main(String[] args) {
    LocalDate locDate  = LocalDate.of(2018, 3, 18); 
    LocalDate locDate1  = locDate.minusMonths(4);   
    System.out.println(locDate1);
    LocalDate locDate2  = locDate.minusWeeks(5);
    System.out.println(locDate2);
  }
}

Результатом работы такой программы будет:

2017-11-18
2018-02-11

Метод now()

now() метод возвращает текущее время для различых классов, например LocalDate, LocalTime, LocalDateTime, ZonedDateTime .

Следующий код показывает, как использовать метод now() для возврата текущей даты и времени.

//nookery.ru
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZonedDateTime;

public class Test {
  public static void main(String[] args) {
    LocalDate locDate = LocalDate.now(); 
    System.out.println(locDate);
    
    LocalTime  locTime  = LocalTime.now();
    System.out.println(locTime);
    
    LocalDateTime  locDateTime  = LocalDateTime.now();
    System.out.println(locDateTime);
    
    ZonedDateTime ZDateTime  = ZonedDateTime.now();
    System.out.println(ZDateTime);
  }
}

Результатом работы программы будет:

2016-03-19
08:20:47.061
2016-03-19T08:20:47.061
2016-03-19T08:20:47.071+04:00[Europe/Moscow]

Обновлено: 08.04.2017 — 11:16

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.