Date & Time in Java SE 8

1,559 views
1,467 views

Published on

Java SE 8 new Time Date API. Introduction.

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,559
On SlideShare
0
From Embeds
0
Number of Embeds
7
Actions
Shares
0
Downloads
27
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Date & Time in Java SE 8

  1. 1. Date & Time Java 8 ilya.lapitan@gmail.com
  2. 2. Java 8: Date & Time Java SE 8 представила новые и современные средства для работы со значениями даты и времени. Их можно найти в пакете: java.time. Классы данного пакета реализуют спецификацию JSR 310: Date and Time API, и основаны на стандарте ISO 8601. Проект разрабатывался под руководством автора Joda Time Stephen Colebourne и компании Oracle.
  3. 3. Java 8: Date & Time Date & Time API используют: -Unicode Common Locale Data Repository (CLDR) самая большая в мире коллекция данных для различных локалей -Time Zone Database (TZDB) коллекция данных о мировых часовых поясах и изменениях в них, начиная с 1970-ого года
  4. 4. Java 8: Date & Time Date & Time API принципы: -Clear - методы хорошо определены, а их поведение понятно и ожидаемо -Fluent - свободный и легкий интерфейс, облегчающий понимание кода. Вызов методов может быть соединен в единую цепочку.
  5. 5. Java 8: Date & Time Date & Time API принципы: -Immutable - большинство создаваемых объектов не изменяемые. При изменении значения объекта, создается новый объект с новым значением. Это обеспечивает Date & Time API потокобезопасность по определению. -Extensible - большие возможности для расширения и реализации функционала под конкретную задачу. Написания пользовательских библиотек.
  6. 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. 7. Java 8: Date & Time Время human time Удобное для восприятия человеком год, месяц, день, час, минута, секунда machine time Удобное для восприятия машиной миллисекунды, наносекунды
  8. 8. Java 8: Date & Time java.time.DayOfWeek - множество, представляющее 7 дней недели. Нумерация дней согласно ISO-8601: 1 - Monday … … 7 - Sunday
  9. 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. 10. Java 8: Date & Time java.time.Month - множество, представляющее 12 месяцев года. Нумерация дней согласно ISO-8601: 1 - January … … 12 - December
  11. 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. 12. Java 8: Date & Time java.time.LocalDate - значение даты без учета временной зоны. Данный класс не содержит какой-либо информации о времени или временной зоне. LocalDate.now(); => 2014-02-23
  13. 13. Java 8: Date & Time Внимание! Класс java.time.LocalDate - value-based класс. Класс java.time.LocalDate использует календарную систему ISO-8601, что может вызвать проблемы в приложениях работающих с историческими датами.
  14. 14. Java 8: Date & Time java.time.YearMonth - значение года и месяца. Данный класс не содержит какой-либо информации о дате, времени или временной зоне. YearMonth.now(); => 2014-02
  15. 15. Java 8: Date & Time Внимание! Класс java.time.YearMonth - value-based класс.
  16. 16. Java 8: Date & Time java.time.MonthDay - значение месяца и дня. Данный класс не содержит какой-либо информации о годе, времени или временной зоне. MonthDay.now(); => --02-23
  17. 17. Java 8: Date & Time Внимание! Класс java.time.MonthDay - value-based класс. Класс java.time.MonthDay использует календарную систему ISO-8601, что может вызвать проблемы в приложениях работающих с историческими датами.
  18. 18. Java 8: Date & Time java.time.Year - хранит информацию об определенном годе. Данный класс не содержит какой-либо информации о времени или временной зоне. Year.now(); => 2014
  19. 19. Java 8: Date & Time Внимание! Класс java.time.Year - value-based класс. Класс java.time.Year использует календарную систему ISO-8601, что может вызвать проблемы в приложениях работающих с историческими датами.
  20. 20. Java 8: Date & Time java.time.LocalTime - хранит информацию о времени. Данный класс не содержит какой-либо информации о дате или временной зоне. Представляется с точностью до наносекунд. LocalTime.now(); => 01:53:42.656
  21. 21. Java 8: Date & Time Внимание! Класс java.time.LocalTime - value-based класс.
  22. 22. Java 8: Date & Time java.time.LocalDateTime - хранит информацию о дате и времени. Данный класс не содержит какой-либо информации о временной зоне. Представляется с точностью до наносекунд. LocalDateTime.now(); => 2014-02-25T01:57:52.250
  23. 23. Java 8: Date & Time Внимание! Класс java.time.LocalDateTime - value-based класс. Класс java.time.LocalDateTime использует календарную систему ISO-8601, что может вызвать проблемы в приложениях работающих с историческими датами.
  24. 24. Java 8: Date & Time TimeZone - регион использующий одинаковый стандарт времени. ZoneId - идентификатор часового пояса, предоставляющий правила преобразования между Instant и LocalDateTime. ZoneOffset - определяет смещение часового пояса относительно Greenwich/UTC
  25. 25. Java 8: Date & Time java.time.ZonedDateTime - хранит информации о дате и времени, с указанием временной зоны. Представляется с точностью до наносекунд. ZonedDateTime.now(); => 2014-02-25T02:09:53.321+03:00[Europe/Minsk]
  26. 26. Java 8: Date & Time Внимание! Класс java.time.ZonedDateTime - value-based класс.
  27. 27. Java 8: Date & Time java.time.OffsetDateTime - хранит информацию о дате и времени, с указанием смещения относительно Greenwich/UTC. Представляется с точностью до наносекунд. OffsetDateTime.now(); => 2014-02-25T02:13:34.737+03:00
  28. 28. Java 8: Date & Time Внимание! Класс java.time.OffsetDateTime - value-based класс.
  29. 29. Java 8: Date & Time java.time.OffsetTime - хранит информаци о времени, с указанием смещения относительно Greenwich/UTC. Представляется с точностью до наносекунд. OffsetTime.now(); => 02:15:50.779+03:00
  30. 30. Java 8: Date & Time Внимание! Класс java.time.OffseTime - value-based класс.
  31. 31. Java 8: Date & Time java.time.Instant - временная метка. Представляется с точностью до наносекунд. Instant.now(); => 2014-02-24T23:18:45.866Z
  32. 32. Java 8: Date & Time Внимание! Класс java.time.Instant - value-based класс. UTC использует концепцию високосных секунд. Java Time API использует собственную шкалу Java TimeScale, которая для значений времени начиная с 197211-03 идентична UTC-SLS.
  33. 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. 34. Java 8: Date & Time Внимание! Класс java.time.Duration - value-based класс.
  35. 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. 36. Java 8: Date & Time Внимание! Класс java.time.Period - value-based класс.
  37. 37. Java 8: Date & Time Value-based классы: - equals, hashCode, и toString опираются на конкретное состояние объекта, а на класс, который он представляет - не сравнивайте объекты данного рода при помощи сравнения их ссылок (==) - используйте для сравнения объектов данного рода только метод equals()
  38. 38. Java 8: Date & Time Value-based классы: - конструкторы отсутствуют, есть только фабричные методы - свободно заменяемые (любые два X и Y равные согласно equals(), при любых вычислениях и вызовах методов не должны производить никаких видимых изменение в поведении)
  39. 39. Java 8: Date & Time java.time.Clock - абстрактный класс для доступа к временной метке, времени и дате с учетом часового пояса.
  40. 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. 41. Java 8: Date & Time java.time.Clock - Текущие методы могут использоваться для тестирования: Clock.offset(Clock, Duration) Clock.systemUTC() Clock.fixed(Instant, ZoneId)
  42. 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. 43. Java 8: Date & Time java.time.format.DateTimeFormatter - используется для форматирования и парсинга значений даты и времени. Для этого используются методы format() и parse() соответственно. java.time.format.DateTimeFormatter позволяет использовать предопределенные форматы даты и времени, либо определять собственные.
  44. 44. Java 8: Date & Time Основные классы java.time определяют собственные методы для форматирования и парсинга значений даты и времени.
  45. 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. 46. Java 8: Date & Time Стандартизованные префиксы имен методов: of with from plus parse minus format to get at is
  47. 47. Java 8: Date & Time Стандартизованные префиксы имен методов: of - создаем экземпляр объекта указанного класса,по набору параметров. Входные данные проверяются, но не конвертируются. LocalDate localDate = LocalDate.of(1986, Month.JUNE, 5); localDate => 1986-06-05
  48. 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. 49. Java 8: Date & Time Стандартизованные префиксы имен методов: parse - создаем экземпляр объекта указанного класса из входной строки LocalDate.parse("2014-12-23") => 2014-12-23
  50. 50. Java 8: Date & Time Стандартизованные префиксы имен методов: format - форматируем строку согласно указанному формату LocalDate localDate = LocalDate.now(); localDate => 2014-02-16 localDate.format(DateTimeFormatter.BASIC_ISO_DATE)) => 20140216
  51. 51. Java 8: Date & Time Стандартизованные префиксы имен методов: get - берем элемент состояния объекта LocalDate.now().getYear() => 2014
  52. 52. Java 8: Date & Time Стандартизованные префиксы имен методов: is - спрашиваем состояние объекта LocalDate.now().isLeapYear() => false
  53. 53. Java 8: Date & Time Стандартизованные префиксы имен методов: with - возвращаем копию объекта с одним измененным элементом состояния LocalDate localDate = LocalDate.now(); localDate => 2014-02-16 localDate.withYear(2016) => 2016-02-16
  54. 54. Java 8: Date & Time Стандартизованные префиксы имен методов: plus - возвращаем копию объекта с увеличенным элементом состояния LocalDate localDate = LocalDate.now(); localDate => 2014-02-16 localDate.plusDays(14) => 2014-03-02 одним
  55. 55. Java 8: Date & Time Стандартизованные префиксы имен методов: minus - возвращаем копию объекта с уменьшенным элементом состояния LocalDate localDate = LocalDate.now(); localDate => 2014-02-16 localDate.minusYears(15) => 1999-02-16 одним
  56. 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. 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. 58. Java 8: Date & Time Совместимость со старым кодом: Calendar.toInstant(): Calendar -> Instant GregorianCalendar.toZonedDateTime(): GregorianCalendar -> ZonedDateTime GregorianCalendar.from(ZonedDateTime): ZonedDateTime -> GregorianCalendar (с использованием дефолтной локали)
  59. 59. Java 8: Date & Time Совместимость со старым кодом: Date.from(Instant): Instant -> Date Date.toInstant(): Date -> Instant TimeZone.toZoneId(): TimeZone -> ZoneId
  60. 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. 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. 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/

×