SlideShare une entreprise Scribd logo
1  sur  62
Télécharger pour lire hors ligne
Date & Time
Java 8
ilya.lapitan@gmail.com
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; => MONDAY
dow.getDisplayName(TextStyle.FULL, Locale.ENGLISH) => Monday
dow.getDisplayName(TextStyle.NARROW, Locale.ENGLISH) => M
dow.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; => MARCH
month.getDisplayName(TextStyle.FULL, Locale.ENGLISH); => March
month.getDisplayName(TextStyle.NARROW, Locale.ENGLISH); => M
month.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 TimeScale, которая для значений времени начиная с 197211-03 идентична UTC-SLS.
Java 8: Date & Time
java.time.Duration - служит для представления
промежутка времени выраженного в единицах времени.
Instant instant1 = Instant.now();
Instant instant2 = instant1.plusSeconds(10);
Duration.between(instant2,instant1).getSeconds() => -10
Duration.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-26
HijrahDate.now() => Hijrah-umalqura AH 1435-04-26
MinguoDate.now() => Minguo ROC 103-02-26
ThaiBuddhistDate.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.701
LocalDate 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-16
localDate.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-16
localDate.withYear(2016) => 2016-02-16
Java 8: Date & Time
Стандартизованные префиксы имен методов:
plus - возвращаем копию объекта с
увеличенным элементом состояния
LocalDate localDate = LocalDate.now();
localDate => 2014-02-16
localDate.plusDays(14) => 2014-03-02

одним
Java 8: Date & Time
Стандартизованные префиксы имен методов:
minus - возвращаем копию объекта с
уменьшенным элементом состояния
LocalDate localDate = LocalDate.now();
localDate => 2014-02-16
localDate.minusYears(15) => 1999-02-16

одним
Java 8: Date & Time
Cтандартизованные префиксы имен методов:
to - конвертируем текущий объект в объект другого типа
LocalDateTime localDateTime = LocalDateTime.now(Clock.systemUTC());
localDateTime => 2014-02-16T00:51:35.731
localDateTime.toLocalDate() => 2014-02-16
Java 8: Date & Time
Стандартизованные префиксы имен методов:
at - комбинируем текущий объект с другим объектом
LocalDate localDate = LocalDate.now();
localDate => 2014-02-16
LocalTime localTime = LocalTime.now();
localTime => 03:55:32.360
localDate.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 8601
http://en.wikipedia.org/wiki/ISO_8601
JSR 310: Date and Time API
https://jcp.org/en/jsr/detail?id=310
Tutorial:
http://docs.oracle.com/javase/tutorial/datetime/index.html
Java 8: Date & Time
Дополнительная информация:
Unicode Common Locale Data Repository
http://cldr.unicode.org/
Time Zone Database
http://www.iana.org/time-zones
UTC SLS
http://www.cl.cam.ac.uk/~mgk25/time/utc-sls/

Contenu connexe

Tendances

Java. Интерфейс Map - ассоциативные массивы.
Java. Интерфейс Map - ассоциативные массивы.Java. Интерфейс Map - ассоциативные массивы.
Java. Интерфейс Map - ассоциативные массивы.Unguryan Vitaliy
 
8. java lecture threads
8. java lecture threads8. java lecture threads
8. java lecture threadsMERA_school
 
10. java lecture generics&collections
10. java lecture generics&collections10. java lecture generics&collections
10. java lecture generics&collectionsMERA_school
 
Java. Строки. Класс String.
Java. Строки. Класс String.Java. Строки. Класс String.
Java. Строки. Класс String.Unguryan Vitaliy
 
Рефлексия в java
Рефлексия в javaРефлексия в java
Рефлексия в javaUnguryan Vitaliy
 
Введение в сетевые технологии
Введение в сетевые технологииВведение в сетевые технологии
Введение в сетевые технологииUnguryan Vitaliy
 
Секреты сборки мусора в Java
Секреты сборки мусора в JavaСекреты сборки мусора в Java
Секреты сборки мусора в Javaaragozin
 
Java. Переменные, типы данных, операторы
Java. Переменные, типы данных, операторыJava. Переменные, типы данных, операторы
Java. Переменные, типы данных, операторыUnguryan Vitaliy
 
Java. Введение в коллекции. Классы обертки. Перечисленияю
Java. Введение в коллекции. Классы обертки.  ПеречисленияюJava. Введение в коллекции. Классы обертки.  Перечисленияю
Java. Введение в коллекции. Классы обертки. ПеречисленияюUnguryan Vitaliy
 
Java Core. Lecture# 5. Concurrency.
Java Core. Lecture# 5. Concurrency.Java Core. Lecture# 5. Concurrency.
Java Core. Lecture# 5. Concurrency.Anton Moiseenko
 
Java. Полиморфизм.
Java. Полиморфизм.Java. Полиморфизм.
Java. Полиморфизм.Unguryan Vitaliy
 
Programming Java - Lection 06 - Multithreading - Lavrentyev Fedor
Programming Java - Lection 06 - Multithreading - Lavrentyev FedorProgramming Java - Lection 06 - Multithreading - Lavrentyev Fedor
Programming Java - Lection 06 - Multithreading - Lavrentyev FedorFedor Lavrentyev
 
5. java lecture io
5. java lecture io5. java lecture io
5. java lecture ioMERA_school
 

Tendances (16)

Java. Интерфейс Map - ассоциативные массивы.
Java. Интерфейс Map - ассоциативные массивы.Java. Интерфейс Map - ассоциативные массивы.
Java. Интерфейс Map - ассоциативные массивы.
 
8. java lecture threads
8. java lecture threads8. java lecture threads
8. java lecture threads
 
10. java lecture generics&collections
10. java lecture generics&collections10. java lecture generics&collections
10. java lecture generics&collections
 
Java. Строки. Класс String.
Java. Строки. Класс String.Java. Строки. Класс String.
Java. Строки. Класс String.
 
Рефлексия в java
Рефлексия в javaРефлексия в java
Рефлексия в java
 
Введение в сетевые технологии
Введение в сетевые технологииВведение в сетевые технологии
Введение в сетевые технологии
 
Секреты сборки мусора в Java
Секреты сборки мусора в JavaСекреты сборки мусора в Java
Секреты сборки мусора в Java
 
Step 3.2
Step 3.2Step 3.2
Step 3.2
 
Java. Переменные, типы данных, операторы
Java. Переменные, типы данных, операторыJava. Переменные, типы данных, операторы
Java. Переменные, типы данных, операторы
 
Java. Введение в коллекции. Классы обертки. Перечисленияю
Java. Введение в коллекции. Классы обертки.  ПеречисленияюJava. Введение в коллекции. Классы обертки.  Перечисленияю
Java. Введение в коллекции. Классы обертки. Перечисленияю
 
Java Core. Lecture# 5. Concurrency.
Java Core. Lecture# 5. Concurrency.Java Core. Lecture# 5. Concurrency.
Java Core. Lecture# 5. Concurrency.
 
Java. Полиморфизм.
Java. Полиморфизм.Java. Полиморфизм.
Java. Полиморфизм.
 
Programming Java - Lection 06 - Multithreading - Lavrentyev Fedor
Programming Java - Lection 06 - Multithreading - Lavrentyev FedorProgramming Java - Lection 06 - Multithreading - Lavrentyev Fedor
Programming Java - Lection 06 - Multithreading - Lavrentyev Fedor
 
5. java lecture io
5. java lecture io5. java lecture io
5. java lecture io
 
Сервлеты
СервлетыСервлеты
Сервлеты
 
Step 7
Step 7Step 7
Step 7
 

En vedette (8)

XML
XMLXML
XML
 
JDBC
JDBCJDBC
JDBC
 
Сетевое взаимодействие
Сетевое взаимодействиеСетевое взаимодействие
Сетевое взаимодействие
 
JSP
JSPJSP
JSP
 
Введение в Spring
Введение в SpringВведение в Spring
Введение в Spring
 
Spring AOP
Spring AOPSpring AOP
Spring AOP
 
JSTL
JSTLJSTL
JSTL
 
Аннотации в java
Аннотации в javaАннотации в java
Аннотации в java
 

Similaire à Date & Time in Java SE 8

Курс Java-2016. Занятие 08. Итераторы, многопоточность
Курс Java-2016. Занятие 08. Итераторы, многопоточностьКурс Java-2016. Занятие 08. Итераторы, многопоточность
Курс Java-2016. Занятие 08. Итераторы, многопоточность7bits
 
CodeFest 2011. Галако О. — О Scala и Lift для тех, кому мало Java, и не только
CodeFest 2011. Галако О. — О Scala и Lift для тех, кому мало Java, и не толькоCodeFest 2011. Галако О. — О Scala и Lift для тех, кому мало Java, и не только
CodeFest 2011. Галако О. — О Scala и Lift для тех, кому мало Java, и не толькоCodeFest
 
Лекция 6
Лекция 6Лекция 6
Лекция 6itc73
 
Новости Global summit 2015
Новости Global summit 2015Новости Global summit 2015
Новости Global summit 2015Timur Safin
 
Память в Java. Garbage Collector
Память в Java. Garbage CollectorПамять в Java. Garbage Collector
Память в Java. Garbage CollectorOlexandra Dmytrenko
 
владивосток форум новости технологий 2015
владивосток форум новости технологий 2015владивосток форум новости технологий 2015
владивосток форум новости технологий 2015Elena Ometova
 
Документирование исходных текстов (javadoc)
Документирование исходных текстов (javadoc)Документирование исходных текстов (javadoc)
Документирование исходных текстов (javadoc)Fedor Malyshkin
 

Similaire à Date & Time in Java SE 8 (11)

Курс Java-2016. Занятие 08. Итераторы, многопоточность
Курс Java-2016. Занятие 08. Итераторы, многопоточностьКурс Java-2016. Занятие 08. Итераторы, многопоточность
Курс Java-2016. Занятие 08. Итераторы, многопоточность
 
Java 8. Thread pools
Java 8. Thread poolsJava 8. Thread pools
Java 8. Thread pools
 
CodeFest 2011. Галако О. — О Scala и Lift для тех, кому мало Java, и не только
CodeFest 2011. Галако О. — О Scala и Lift для тех, кому мало Java, и не толькоCodeFest 2011. Галако О. — О Scala и Lift для тех, кому мало Java, и не только
CodeFest 2011. Галако О. — О Scala и Lift для тех, кому мало Java, и не только
 
Лекция 6
Лекция 6Лекция 6
Лекция 6
 
Underscore js
Underscore jsUnderscore js
Underscore js
 
Scala for android
Scala for androidScala for android
Scala for android
 
Новости Global summit 2015
Новости Global summit 2015Новости Global summit 2015
Новости Global summit 2015
 
Память в Java. Garbage Collector
Память в Java. Garbage CollectorПамять в Java. Garbage Collector
Память в Java. Garbage Collector
 
владивосток форум новости технологий 2015
владивосток форум новости технологий 2015владивосток форум новости технологий 2015
владивосток форум новости технологий 2015
 
Java threads - part 2
Java threads - part 2Java threads - part 2
Java threads - part 2
 
Документирование исходных текстов (javadoc)
Документирование исходных текстов (javadoc)Документирование исходных текстов (javadoc)
Документирование исходных текстов (javadoc)
 

Plus de Ilya Lapitan

Learn Java with Coursera
Learn Java  with  CourseraLearn Java  with  Coursera
Learn Java with CourseraIlya Lapitan
 
Apache Camel Lifecycle
Apache Camel LifecycleApache Camel Lifecycle
Apache Camel LifecycleIlya Lapitan
 
Apache Camel + Apache ActiveMQ persistence
Apache Camel + Apache ActiveMQ persistenceApache Camel + Apache ActiveMQ persistence
Apache Camel + Apache ActiveMQ persistenceIlya Lapitan
 
Google советы успешного поиска
 Google советы успешного поиска Google советы успешного поиска
Google советы успешного поискаIlya Lapitan
 
Архивы в Java
Архивы в JavaАрхивы в Java
Архивы в JavaIlya Lapitan
 
Стратегии выполнения тестов в Gradle
Стратегии выполнения тестов в GradleСтратегии выполнения тестов в Gradle
Стратегии выполнения тестов в GradleIlya Lapitan
 

Plus de Ilya Lapitan (14)

JDK 12
JDK 12JDK 12
JDK 12
 
JDK 11
JDK 11JDK 11
JDK 11
 
Learn Java with Coursera
Learn Java  with  CourseraLearn Java  with  Coursera
Learn Java with Coursera
 
Apache Camel Lifecycle
Apache Camel LifecycleApache Camel Lifecycle
Apache Camel Lifecycle
 
Apache Camel + Apache ActiveMQ persistence
Apache Camel + Apache ActiveMQ persistenceApache Camel + Apache ActiveMQ persistence
Apache Camel + Apache ActiveMQ persistence
 
Maven lifecycle
Maven lifecycleMaven lifecycle
Maven lifecycle
 
Amazon S3
Amazon S3 Amazon S3
Amazon S3
 
Bash scripting
 Bash scripting Bash scripting
Bash scripting
 
Linux commands
Linux commandsLinux commands
Linux commands
 
Google советы успешного поиска
 Google советы успешного поиска Google советы успешного поиска
Google советы успешного поиска
 
Архивы в Java
Архивы в JavaАрхивы в Java
Архивы в Java
 
Стратегии выполнения тестов в Gradle
Стратегии выполнения тестов в GradleСтратегии выполнения тестов в Gradle
Стратегии выполнения тестов в Gradle
 
Apache2
Apache2Apache2
Apache2
 
Gradle
GradleGradle
Gradle
 

Date & Time in Java SE 8

  • 1. Date & Time Java 8 ilya.lapitan@gmail.com
  • 2. Java 8: Date & Time Java SE 8 представила новые и современные средства для работы со значениями даты и времени. Их можно найти в пакете: java.time. Классы данного пакета реализуют спецификацию JSR 310: Date and Time API, и основаны на стандарте ISO 8601. Проект разрабатывался под руководством автора Joda Time Stephen Colebourne и компании Oracle.
  • 3. Java 8: Date & Time Date & Time API используют: -Unicode Common Locale Data Repository (CLDR) самая большая в мире коллекция данных для различных локалей -Time Zone Database (TZDB) коллекция данных о мировых часовых поясах и изменениях в них, начиная с 1970-ого года
  • 4. Java 8: Date & Time Date & Time API принципы: -Clear - методы хорошо определены, а их поведение понятно и ожидаемо -Fluent - свободный и легкий интерфейс, облегчающий понимание кода. Вызов методов может быть соединен в единую цепочку.
  • 5. Java 8: Date & Time Date & Time API принципы: -Immutable - большинство создаваемых объектов не изменяемые. При изменении значения объекта, создается новый объект с новым значением. Это обеспечивает Date & Time API потокобезопасность по определению. -Extensible - большие возможности для расширения и реализации функционала под конкретную задачу. Написания пользовательских библиотек.
  • 6. 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 для поддержки временных зон
  • 7. Java 8: Date & Time Время human time Удобное для восприятия человеком год, месяц, день, час, минута, секунда machine time Удобное для восприятия машиной миллисекунды, наносекунды
  • 8. Java 8: Date & Time java.time.DayOfWeek - множество, представляющее 7 дней недели. Нумерация дней согласно ISO-8601: 1 - Monday … … 7 - Sunday
  • 9. Java 8: Date & Time java.time.DayOfWeek - множество, представляющее 7 дней недели. DayOfWeek dow = DayOfWeek.MONDAY; => MONDAY dow.getDisplayName(TextStyle.FULL, Locale.ENGLISH) => Monday dow.getDisplayName(TextStyle.NARROW, Locale.ENGLISH) => M dow.getDisplayName(TextStyle.SHORT, Locale.ENGLISH) => Mon
  • 10. Java 8: Date & Time java.time.Month - множество, представляющее 12 месяцев года. Нумерация дней согласно ISO-8601: 1 - January … … 12 - December
  • 11. Java 8: Date & Time java.time.Month - множество, представляющее 12 месяцев года. Month month = Month.MARCH; => MARCH month.getDisplayName(TextStyle.FULL, Locale.ENGLISH); => March month.getDisplayName(TextStyle.NARROW, Locale.ENGLISH); => M month.getDisplayName(TextStyle.SHORT, Locale.ENGLISH)); => Mar
  • 12. Java 8: Date & Time java.time.LocalDate - значение даты без учета временной зоны. Данный класс не содержит какой-либо информации о времени или временной зоне. LocalDate.now(); => 2014-02-23
  • 13. Java 8: Date & Time Внимание! Класс java.time.LocalDate - value-based класс. Класс java.time.LocalDate использует календарную систему ISO-8601, что может вызвать проблемы в приложениях работающих с историческими датами.
  • 14. Java 8: Date & Time java.time.YearMonth - значение года и месяца. Данный класс не содержит какой-либо информации о дате, времени или временной зоне. YearMonth.now(); => 2014-02
  • 15. Java 8: Date & Time Внимание! Класс java.time.YearMonth - value-based класс.
  • 16. Java 8: Date & Time java.time.MonthDay - значение месяца и дня. Данный класс не содержит какой-либо информации о годе, времени или временной зоне. MonthDay.now(); => --02-23
  • 17. Java 8: Date & Time Внимание! Класс java.time.MonthDay - value-based класс. Класс java.time.MonthDay использует календарную систему ISO-8601, что может вызвать проблемы в приложениях работающих с историческими датами.
  • 18. Java 8: Date & Time java.time.Year - хранит информацию об определенном годе. Данный класс не содержит какой-либо информации о времени или временной зоне. Year.now(); => 2014
  • 19. Java 8: Date & Time Внимание! Класс java.time.Year - value-based класс. Класс java.time.Year использует календарную систему ISO-8601, что может вызвать проблемы в приложениях работающих с историческими датами.
  • 20. Java 8: Date & Time java.time.LocalTime - хранит информацию о времени. Данный класс не содержит какой-либо информации о дате или временной зоне. Представляется с точностью до наносекунд. LocalTime.now(); => 01:53:42.656
  • 21. Java 8: Date & Time Внимание! Класс java.time.LocalTime - value-based класс.
  • 22. Java 8: Date & Time java.time.LocalDateTime - хранит информацию о дате и времени. Данный класс не содержит какой-либо информации о временной зоне. Представляется с точностью до наносекунд. LocalDateTime.now(); => 2014-02-25T01:57:52.250
  • 23. Java 8: Date & Time Внимание! Класс java.time.LocalDateTime - value-based класс. Класс java.time.LocalDateTime использует календарную систему ISO-8601, что может вызвать проблемы в приложениях работающих с историческими датами.
  • 24. Java 8: Date & Time TimeZone - регион использующий одинаковый стандарт времени. ZoneId - идентификатор часового пояса, предоставляющий правила преобразования между Instant и LocalDateTime. ZoneOffset - определяет смещение часового пояса относительно Greenwich/UTC
  • 25. Java 8: Date & Time java.time.ZonedDateTime - хранит информации о дате и времени, с указанием временной зоны. Представляется с точностью до наносекунд. ZonedDateTime.now(); => 2014-02-25T02:09:53.321+03:00[Europe/Minsk]
  • 26. Java 8: Date & Time Внимание! Класс java.time.ZonedDateTime - value-based класс.
  • 27. Java 8: Date & Time java.time.OffsetDateTime - хранит информацию о дате и времени, с указанием смещения относительно Greenwich/UTC. Представляется с точностью до наносекунд. OffsetDateTime.now(); => 2014-02-25T02:13:34.737+03:00
  • 28. Java 8: Date & Time Внимание! Класс java.time.OffsetDateTime - value-based класс.
  • 29. Java 8: Date & Time java.time.OffsetTime - хранит информаци о времени, с указанием смещения относительно Greenwich/UTC. Представляется с точностью до наносекунд. OffsetTime.now(); => 02:15:50.779+03:00
  • 30. Java 8: Date & Time Внимание! Класс java.time.OffseTime - value-based класс.
  • 31. Java 8: Date & Time java.time.Instant - временная метка. Представляется с точностью до наносекунд. Instant.now(); => 2014-02-24T23:18:45.866Z
  • 32. Java 8: Date & Time Внимание! Класс java.time.Instant - value-based класс. UTC использует концепцию високосных секунд. Java Time API использует собственную шкалу Java TimeScale, которая для значений времени начиная с 197211-03 идентична UTC-SLS.
  • 33. Java 8: Date & Time java.time.Duration - служит для представления промежутка времени выраженного в единицах времени. Instant instant1 = Instant.now(); Instant instant2 = instant1.plusSeconds(10); Duration.between(instant2,instant1).getSeconds() => -10 Duration.between(instant2,instant1).abs().getSeconds() => 10
  • 34. Java 8: Date & Time Внимание! Класс java.time.Duration - value-based класс.
  • 35. 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
  • 36. Java 8: Date & Time Внимание! Класс java.time.Period - value-based класс.
  • 37. Java 8: Date & Time Value-based классы: - equals, hashCode, и toString опираются на конкретное состояние объекта, а на класс, который он представляет - не сравнивайте объекты данного рода при помощи сравнения их ссылок (==) - используйте для сравнения объектов данного рода только метод equals()
  • 38. Java 8: Date & Time Value-based классы: - конструкторы отсутствуют, есть только фабричные методы - свободно заменяемые (любые два X и Y равные согласно equals(), при любых вычислениях и вызовах методов не должны производить никаких видимых изменение в поведении)
  • 39. Java 8: Date & Time java.time.Clock - абстрактный класс для доступа к временной метке, времени и дате с учетом часового пояса.
  • 40. 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)) { ... } } }
  • 41. Java 8: Date & Time java.time.Clock - Текущие методы могут использоваться для тестирования: Clock.offset(Clock, Duration) Clock.systemUTC() Clock.fixed(Instant, ZoneId)
  • 42. Java 8: Date & Time java.time.chrono - API для работы с календарями отличными от стандарта ISO 8601: JapaneseDate.now() => Japanese Heisei 26-02-26 HijrahDate.now() => Hijrah-umalqura AH 1435-04-26 MinguoDate.now() => Minguo ROC 103-02-26 ThaiBuddhistDate.now() => ThaiBuddhist BE 2557-02-26
  • 43. Java 8: Date & Time java.time.format.DateTimeFormatter - используется для форматирования и парсинга значений даты и времени. Для этого используются методы format() и parse() соответственно. java.time.format.DateTimeFormatter позволяет использовать предопределенные форматы даты и времени, либо определять собственные.
  • 44. Java 8: Date & Time Основные классы java.time определяют собственные методы для форматирования и парсинга значений даты и времени.
  • 45. 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
  • 46. Java 8: Date & Time Стандартизованные префиксы имен методов: of with from plus parse minus format to get at is
  • 47. Java 8: Date & Time Стандартизованные префиксы имен методов: of - создаем экземпляр объекта указанного класса,по набору параметров. Входные данные проверяются, но не конвертируются. LocalDate localDate = LocalDate.of(1986, Month.JUNE, 5); localDate => 1986-06-05
  • 48. Java 8: Date & Time Стандартизованные префиксы имен методов: from - создаем экземпляр объекта указанного класса, из другого объекта. Может наблюдаться потеря некоторых исходных данных (их усечение). LocalDateTime localDateTime = LocalDateTime.now(Clock.systemUTC()); localDateTime => 2014-02-15T23:48:52.701 LocalDate localDate = LocalDate.from(localDateTime); localDate => 2014-02-15
  • 49. Java 8: Date & Time Стандартизованные префиксы имен методов: parse - создаем экземпляр объекта указанного класса из входной строки LocalDate.parse("2014-12-23") => 2014-12-23
  • 50. Java 8: Date & Time Стандартизованные префиксы имен методов: format - форматируем строку согласно указанному формату LocalDate localDate = LocalDate.now(); localDate => 2014-02-16 localDate.format(DateTimeFormatter.BASIC_ISO_DATE)) => 20140216
  • 51. Java 8: Date & Time Стандартизованные префиксы имен методов: get - берем элемент состояния объекта LocalDate.now().getYear() => 2014
  • 52. Java 8: Date & Time Стандартизованные префиксы имен методов: is - спрашиваем состояние объекта LocalDate.now().isLeapYear() => false
  • 53. Java 8: Date & Time Стандартизованные префиксы имен методов: with - возвращаем копию объекта с одним измененным элементом состояния LocalDate localDate = LocalDate.now(); localDate => 2014-02-16 localDate.withYear(2016) => 2016-02-16
  • 54. Java 8: Date & Time Стандартизованные префиксы имен методов: plus - возвращаем копию объекта с увеличенным элементом состояния LocalDate localDate = LocalDate.now(); localDate => 2014-02-16 localDate.plusDays(14) => 2014-03-02 одним
  • 55. Java 8: Date & Time Стандартизованные префиксы имен методов: minus - возвращаем копию объекта с уменьшенным элементом состояния LocalDate localDate = LocalDate.now(); localDate => 2014-02-16 localDate.minusYears(15) => 1999-02-16 одним
  • 56. Java 8: Date & Time Cтандартизованные префиксы имен методов: to - конвертируем текущий объект в объект другого типа LocalDateTime localDateTime = LocalDateTime.now(Clock.systemUTC()); localDateTime => 2014-02-16T00:51:35.731 localDateTime.toLocalDate() => 2014-02-16
  • 57. Java 8: Date & Time Стандартизованные префиксы имен методов: at - комбинируем текущий объект с другим объектом LocalDate localDate = LocalDate.now(); localDate => 2014-02-16 LocalTime localTime = LocalTime.now(); localTime => 03:55:32.360 localDate.atTime(localTime) => 2014-02-16T03:55:32.360
  • 58. Java 8: Date & Time Совместимость со старым кодом: Calendar.toInstant(): Calendar -> Instant GregorianCalendar.toZonedDateTime(): GregorianCalendar -> ZonedDateTime GregorianCalendar.from(ZonedDateTime): ZonedDateTime -> GregorianCalendar (с использованием дефолтной локали)
  • 59. Java 8: Date & Time Совместимость со старым кодом: Date.from(Instant): Instant -> Date Date.toInstant(): Date -> Instant TimeZone.toZoneId(): TimeZone -> ZoneId
  • 60. Java 8: Date & Time Работа с базой данных: ANSI SQL Java SE 8 DATE LocalDate TIME LocalTime TIMESTAMP LocalDateTime TIME WITH TIMEZONE OffsetTime TIMESTAMP WITH TIMEZONE OffsetDateTime
  • 61. Java 8: Date & Time Дополнительная информация: Стандарт ISO 8601 http://en.wikipedia.org/wiki/ISO_8601 JSR 310: Date and Time API https://jcp.org/en/jsr/detail?id=310 Tutorial: http://docs.oracle.com/javase/tutorial/datetime/index.html
  • 62. Java 8: Date & Time Дополнительная информация: Unicode Common Locale Data Repository http://cldr.unicode.org/ Time Zone Database http://www.iana.org/time-zones UTC SLS http://www.cl.cam.ac.uk/~mgk25/time/utc-sls/