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/