date & time in java se 8
DESCRIPTION
Java SE 8 new Time Date API. Introduction.TRANSCRIPT
Date & Time Java 8
Java 8: Date & Time
Java SE 8 представила новые и современные средства для работы со значениями даты и времени. Их можно найти в пакете: java.time.
Классы данного пакета реализуют спецификацию JSR 310: Date and Time API, и основаны на стандарте ISO 8601.
Проект разрабатывался под руководством автора Joda Time Stephen Colebourne и компании Oracle.
Java 8: Date & Time
Date & Time API используют:-Unicode Common Locale Data Repository (CLDR) самая большая в мире коллекция данных для различных локалей-Time Zone Database (TZDB)коллекция данных о мировых часовых поясах и изменениях в них, начиная с 1970-ого года
Java 8: Date & Time
Date & Time API принципы:-Clear - методы хорошо определены, а их поведение понятно и ожидаемо-Fluent - свободный и легкий интерфейс, облегчающий понимание кода. Вызов методов может быть соединен в единую цепочку.
Java 8: Date & Time
Date & Time API принципы:-Immutable - большинство создаваемых объектов не изменяемые. При изменении значения объекта, создается новый объект с новым значением. Это обеспечивает Date & Time API потокобезопасность по определению.-Extensible - большие возможности для расширения и реализации функционала под конкретную задачу. Написания пользовательских библиотек.
Java 8: Date & Time
Cостав java.time:java.time - API для работы с датой и временем. Все классы immutable и thread-safe. Основное API.java.time.chrono - API для работы с календарями отличными от стандарта ISO 8601.java.time.format - API для парсинга и форматирования значений даты и времениjava.time.temporal - API для доступа к единицам измерения даты и времениjava.time.zone - API для поддержки временных зон
Java 8: Date & Time
Время
Удобное для восприятия человеком
Удобное для восприятия
машиной
human time machine time
год, месяц, день, час, минута, секунда миллисекунды, наносекунды
Java 8: Date & Time
java.time.DayOfWeek - множество, представляющее 7 дней недели.
Нумерация дней согласно ISO-8601:1 - Monday……7 - Sunday
Java 8: Date & Time
java.time.DayOfWeek - множество, представляющее 7 дней недели.
DayOfWeek dow = DayOfWeek.MONDAY; => MONDAYdow.getDisplayName(TextStyle.FULL, Locale.ENGLISH) => Mondaydow.getDisplayName(TextStyle.NARROW, Locale.ENGLISH) => Mdow.getDisplayName(TextStyle.SHORT, Locale.ENGLISH) => Mon
Java 8: Date & Time
java.time.Month - множество, представляющее 12 месяцев года.
Нумерация дней согласно ISO-8601:1 - January……12 - December
Java 8: Date & Time
java.time.Month - множество, представляющее 12 месяцев года.
Month month = Month.MARCH; => MARCHmonth.getDisplayName(TextStyle.FULL, Locale.ENGLISH); => Marchmonth.getDisplayName(TextStyle.NARROW, Locale.ENGLISH); => Mmonth.getDisplayName(TextStyle.SHORT, Locale.ENGLISH)); => Mar
Java 8: Date & Time
java.time.LocalDate - значение даты без учета временной зоны. Данный класс не содержит какой-либо информации о времени или временной зоне.
LocalDate.now(); => 2014-02-23
Java 8: Date & Time
Внимание!
Класс java.time.LocalDate - value-based класс.
Класс java.time.LocalDate использует календарную систему ISO-8601, что может вызвать проблемы в приложениях работающих с историческими датами.
Java 8: Date & Time
java.time.YearMonth - значение года и месяца. Данный класс не содержит какой-либо информации о дате, времени или временной зоне.
YearMonth.now(); => 2014-02
Java 8: Date & Time
Внимание!
Класс java.time.YearMonth - value-based класс.
Java 8: Date & Time
java.time.MonthDay - значение месяца и дня. Данный класс не содержит какой-либо информации о годе, времени или временной зоне.
MonthDay.now(); => --02-23
Java 8: Date & Time
Внимание!
Класс java.time.MonthDay - value-based класс.
Класс java.time.MonthDay использует календарную систему ISO-8601, что может вызвать проблемы в приложениях работающих с историческими датами.
Java 8: Date & Time
java.time.Year - хранит информацию об определенном годе. Данный класс не содержит какой-либо информации о времени или временной зоне.
Year.now(); => 2014
Java 8: Date & Time
Внимание!
Класс java.time.Year - value-based класс.
Класс java.time.Year использует календарную систему ISO-8601, что может вызвать проблемы в приложениях работающих с историческими датами.
Java 8: Date & Time
java.time.LocalTime - хранит информацию о времени. Данный класс не содержит какой-либо информации о дате или временной зоне. Представляется с точностью до наносекунд.
LocalTime.now(); => 01:53:42.656
Java 8: Date & Time
Внимание!
Класс java.time.LocalTime - value-based класс.
Java 8: Date & Time
java.time.LocalDateTime - хранит информацию о дате и времени. Данный класс не содержит какой-либо информации о временной зоне. Представляется с точностью до наносекунд.
LocalDateTime.now(); => 2014-02-25T01:57:52.250
Java 8: Date & Time
Внимание!
Класс java.time.LocalDateTime - value-based класс.
Класс java.time.LocalDateTime использует календарную систему ISO-8601, что может вызвать проблемы в приложениях работающих с историческими датами.
Java 8: Date & Time
TimeZone - регион использующий одинаковый стандарт времени.
ZoneId - идентификатор часового пояса, предоставляющий правила преобразования между Instant и LocalDateTime.
ZoneOffset - определяет смещение часового пояса относительно Greenwich/UTC
Java 8: Date & Time
java.time.ZonedDateTime - хранит информации о дате и времени, с указанием временной зоны. Представляется с точностью до наносекунд.
ZonedDateTime.now(); => 2014-02-25T02:09:53.321+03:00[Europe/Minsk]
Java 8: Date & Time
Внимание!
Класс java.time.ZonedDateTime - value-based класс.
Java 8: Date & Time
java.time.OffsetDateTime - хранит информацию о дате и времени, с указанием смещения относительно Greenwich/UTC. Представляется с точностью до наносекунд.
OffsetDateTime.now(); => 2014-02-25T02:13:34.737+03:00
Java 8: Date & Time
Внимание!
Класс java.time.OffsetDateTime - value-based класс.
Java 8: Date & Time
java.time.OffsetTime - хранит информаци о времени, с указанием смещения относительно Greenwich/UTC. Представляется с точностью до наносекунд.
OffsetTime.now(); => 02:15:50.779+03:00
Java 8: Date & Time
Внимание!
Класс java.time.OffseTime - value-based класс.
Java 8: Date & Time
java.time.Instant - временная метка. Представляется с точностью до наносекунд.
Instant.now(); => 2014-02-24T23:18:45.866Z
Java 8: Date & Time
Внимание!
Класс java.time.Instant - value-based класс.
UTC использует концепцию високосных секунд. Java Time API использует собственную шкалу Java Time-Scale, которая для значений времени начиная с 1972-11-03 идентична UTC-SLS.
Java 8: Date & Time
java.time.Duration - служит для представления промежутка времени выраженного в единицах времени.
Instant instant1 = Instant.now();Instant instant2 = instant1.plusSeconds(10);Duration.between(instant2,instant1).getSeconds() => -10Duration.between(instant2,instant1).abs().getSeconds() => 10
Java 8: Date & Time
Внимание!
Класс java.time.Duration - value-based класс.
Java 8: Date & Time
java.time.Period - служит для представления промежутка времени выраженного в единицах даты.
LocalDate today = LocalDate.now();LocalDate birthday = LocalDate.of(1986, Month.JUNE, 05);Period.between(birthday,today).getYears() => 27
Java 8: Date & Time
Внимание!
Класс java.time.Period - value-based класс.
Java 8: Date & Time
Value-based классы:- equals, hashCode, и toString опираются на конкретное состояние объекта, а на класс, который он представляет
- не сравнивайте объекты данного рода при помощи сравнения их ссылок (==)
- используйте для сравнения объектов данного рода только метод equals()
Java 8: Date & Time
Value-based классы:- конструкторы отсутствуют, есть только фабричные методы
- свободно заменяемые (любые два X и Y равные согласно equals(), при любых вычислениях и вызовах методов не должны производить никаких видимых изменение в поведении)
Java 8: Date & Time
java.time.Clock - абстрактный класс для доступа к временной метке, времени и дате с учетом часового пояса.
Java 8: Date & Time
java.time.Clock - Best practice:
public class MyBean { private Clock clock; // dependency inject ... public void process(LocalDate eventDate) { if (eventDate.isBefore(LocalDate.now(clock)) { ... } }}
Java 8: Date & Time
java.time.Clock - Текущие методы могут использоваться для тестирования:Clock.offset(Clock, Duration)Clock.systemUTC() Clock.fixed(Instant, ZoneId)
Java 8: Date & Time
java.time.chrono - API для работы с календарями отличными от стандарта ISO 8601:JapaneseDate.now() => Japanese Heisei 26-02-26HijrahDate.now() => Hijrah-umalqura AH 1435-04-26MinguoDate.now() => Minguo ROC 103-02-26ThaiBuddhistDate.now() => ThaiBuddhist BE 2557-02-26
Java 8: Date & Time
java.time.format.DateTimeFormatter - используется для форматирования и парсинга значений даты и времени.Для этого используются методы format() и parse() соответственно.
java.time.format.DateTimeFormatter позволяет использовать предопределенные форматы даты и времени, либо определять собственные.
Java 8: Date & Time
Основные классы java.time определяют собственные методы для форматирования и парсинга значений даты и времени.
Java 8: Date & Time
Парсинг:LocalDate.parse("20140225",DateTimeFormatter.BASIC_ISO_DATE)20140225 => 2014-02-25
Форматирование:ZonedDateTime.now().format(DateTimeFormatter.RFC_1123_DATE_TIME)2014-02-25T03:00:09.559+03:00[Europe/Minsk] => Tue, 25 Feb 2014 03:00:09 +0300
Java 8: Date & Time
Стандартизованные префиксы имен методов:
of with
from plus
parse minus
format to
get at
is
Java 8: Date & Time
Стандартизованные префиксы имен методов:of - создаем экземпляр объекта указанного класса,по набору параметров. Входные данные проверяются, но не конвертируются.
LocalDate localDate = LocalDate.of(1986, Month.JUNE, 5);localDate => 1986-06-05
Java 8: Date & Time
Стандартизованные префиксы имен методов:from - создаем экземпляр объекта указанного класса, из другого объекта. Может наблюдаться потеря некоторых исходных данных (их усечение).
LocalDateTime localDateTime = LocalDateTime.now(Clock.systemUTC());localDateTime => 2014-02-15T23:48:52.701LocalDate localDate = LocalDate.from(localDateTime);localDate => 2014-02-15
Java 8: Date & Time
Стандартизованные префиксы имен методов:parse - создаем экземпляр объекта указанного класса из входной строки
LocalDate.parse("2014-12-23") => 2014-12-23
Java 8: Date & Time
Стандартизованные префиксы имен методов:format - форматируем строку согласно указанному формату
LocalDate localDate = LocalDate.now();localDate => 2014-02-16localDate.format(DateTimeFormatter.BASIC_ISO_DATE)) => 20140216
Java 8: Date & Time
Стандартизованные префиксы имен методов:get - берем элемент состояния объекта
LocalDate.now().getYear() => 2014
Java 8: Date & Time
Стандартизованные префиксы имен методов:is - спрашиваем состояние объекта
LocalDate.now().isLeapYear() => false
Java 8: Date & Time
Стандартизованные префиксы имен методов:with - возвращаем копию объекта с одним измененным элементом состояния
LocalDate localDate = LocalDate.now();localDate => 2014-02-16localDate.withYear(2016) => 2016-02-16
Java 8: Date & Time
Стандартизованные префиксы имен методов:plus - возвращаем копию объекта с одним увеличенным элементом состояния
LocalDate localDate = LocalDate.now();localDate => 2014-02-16localDate.plusDays(14) => 2014-03-02
Java 8: Date & Time
Стандартизованные префиксы имен методов:minus - возвращаем копию объекта с одним уменьшенным элементом состояния
LocalDate localDate = LocalDate.now();localDate => 2014-02-16localDate.minusYears(15) => 1999-02-16
Java 8: Date & Time
Cтандартизованные префиксы имен методов:to - конвертируем текущий объект в объект другого типа
LocalDateTime localDateTime = LocalDateTime.now(Clock.systemUTC());localDateTime => 2014-02-16T00:51:35.731localDateTime.toLocalDate() => 2014-02-16
Java 8: Date & Time
Стандартизованные префиксы имен методов:at - комбинируем текущий объект с другим объектом
LocalDate localDate = LocalDate.now();localDate => 2014-02-16LocalTime localTime = LocalTime.now();localTime => 03:55:32.360localDate.atTime(localTime) => 2014-02-16T03:55:32.360
Java 8: Date & Time
Совместимость со старым кодом:Calendar.toInstant(): Calendar -> Instant
GregorianCalendar.toZonedDateTime(): GregorianCalendar -> ZonedDateTime
GregorianCalendar.from(ZonedDateTime): ZonedDateTime -> GregorianCalendar (с использованием дефолтной локали)
Java 8: Date & Time
Совместимость со старым кодом:Date.from(Instant):Instant -> Date
Date.toInstant():Date -> Instant
TimeZone.toZoneId():TimeZone -> ZoneId
Java 8: Date & Time
Работа с базой данных:ANSI SQL Java SE 8
DATE LocalDate
TIME LocalTime
TIMESTAMP LocalDateTime
TIME WITH TIMEZONE OffsetTime
TIMESTAMP WITH TIMEZONE OffsetDateTime
Java 8: Date & Time
Дополнительная информация:Стандарт ISO 8601http://en.wikipedia.org/wiki/ISO_8601JSR 310: Date and Time APIhttps://jcp.org/en/jsr/detail?id=310Tutorial:http://docs.oracle.com/javase/tutorial/datetime/index.html
Java 8: Date & Time
Дополнительная информация:Unicode Common Locale Data Repositoryhttp://cldr.unicode.org/Time Zone Databasehttp://www.iana.org/time-zonesUTC SLShttp://www.cl.cam.ac.uk/~mgk25/time/utc-sls/