date & time in java se 8

62
Date & Time Java 8 [email protected]

Upload: ilia-lapitan

Post on 25-Dec-2014

790 views

Category:

Technology


1 download

DESCRIPTION

Java SE 8 new Time Date API. Introduction.

TRANSCRIPT

Page 1: Date & Time in Java SE 8

Date & Time Java 8

[email protected]

Page 2: Date & Time in Java SE 8

Java 8: Date & Time

Java SE 8 представила новые и современные средства для работы со значениями даты и времени. Их можно найти в пакете: java.time.

Классы данного пакета реализуют спецификацию JSR 310: Date and Time API, и основаны на стандарте ISO 8601.

Проект разрабатывался под руководством автора Joda Time Stephen Colebourne и компании Oracle.

Page 3: Date & Time in Java SE 8

Java 8: Date & Time

Date & Time API используют:-Unicode Common Locale Data Repository (CLDR) самая большая в мире коллекция данных для различных локалей-Time Zone Database (TZDB)коллекция данных о мировых часовых поясах и изменениях в них, начиная с 1970-ого года

Page 4: Date & Time in Java SE 8

Java 8: Date & Time

Date & Time API принципы:-Clear - методы хорошо определены, а их поведение понятно и ожидаемо-Fluent - свободный и легкий интерфейс, облегчающий понимание кода. Вызов методов может быть соединен в единую цепочку.

Page 5: Date & Time in Java SE 8

Java 8: Date & Time

Date & Time API принципы:-Immutable - большинство создаваемых объектов не изменяемые. При изменении значения объекта, создается новый объект с новым значением. Это обеспечивает Date & Time API потокобезопасность по определению.-Extensible - большие возможности для расширения и реализации функционала под конкретную задачу. Написания пользовательских библиотек.

Page 6: Date & Time in Java SE 8

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 для поддержки временных зон

Page 7: Date & Time in Java SE 8

Java 8: Date & Time

Время

Удобное для восприятия человеком

Удобное для восприятия

машиной

human time machine time

год, месяц, день, час, минута, секунда миллисекунды, наносекунды

Page 8: Date & Time in Java SE 8

Java 8: Date & Time

java.time.DayOfWeek - множество, представляющее 7 дней недели.

Нумерация дней согласно ISO-8601:1 - Monday……7 - Sunday

Page 9: Date & Time in Java SE 8

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

Page 10: Date & Time in Java SE 8

Java 8: Date & Time

java.time.Month - множество, представляющее 12 месяцев года.

Нумерация дней согласно ISO-8601:1 - January……12 - December

Page 11: Date & Time in Java SE 8

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

Page 12: Date & Time in Java SE 8

Java 8: Date & Time

java.time.LocalDate - значение даты без учета временной зоны. Данный класс не содержит какой-либо информации о времени или временной зоне.

LocalDate.now(); => 2014-02-23

Page 13: Date & Time in Java SE 8

Java 8: Date & Time

Внимание!

Класс java.time.LocalDate - value-based класс.

Класс java.time.LocalDate использует календарную систему ISO-8601, что может вызвать проблемы в приложениях работающих с историческими датами.

Page 14: Date & Time in Java SE 8

Java 8: Date & Time

java.time.YearMonth - значение года и месяца. Данный класс не содержит какой-либо информации о дате, времени или временной зоне.

YearMonth.now(); => 2014-02

Page 15: Date & Time in Java SE 8

Java 8: Date & Time

Внимание!

Класс java.time.YearMonth - value-based класс.

Page 16: Date & Time in Java SE 8

Java 8: Date & Time

java.time.MonthDay - значение месяца и дня. Данный класс не содержит какой-либо информации о годе, времени или временной зоне.

MonthDay.now(); => --02-23

Page 17: Date & Time in Java SE 8

Java 8: Date & Time

Внимание!

Класс java.time.MonthDay - value-based класс.

Класс java.time.MonthDay использует календарную систему ISO-8601, что может вызвать проблемы в приложениях работающих с историческими датами.

Page 18: Date & Time in Java SE 8

Java 8: Date & Time

java.time.Year - хранит информацию об определенном годе. Данный класс не содержит какой-либо информации о времени или временной зоне.

Year.now(); => 2014

Page 19: Date & Time in Java SE 8

Java 8: Date & Time

Внимание!

Класс java.time.Year - value-based класс.

Класс java.time.Year использует календарную систему ISO-8601, что может вызвать проблемы в приложениях работающих с историческими датами.

Page 20: Date & Time in Java SE 8

Java 8: Date & Time

java.time.LocalTime - хранит информацию о времени. Данный класс не содержит какой-либо информации о дате или временной зоне. Представляется с точностью до наносекунд.

LocalTime.now(); => 01:53:42.656

Page 21: Date & Time in Java SE 8

Java 8: Date & Time

Внимание!

Класс java.time.LocalTime - value-based класс.

Page 22: Date & Time in Java SE 8

Java 8: Date & Time

java.time.LocalDateTime - хранит информацию о дате и времени. Данный класс не содержит какой-либо информации о временной зоне. Представляется с точностью до наносекунд.

LocalDateTime.now(); => 2014-02-25T01:57:52.250

Page 23: Date & Time in Java SE 8

Java 8: Date & Time

Внимание!

Класс java.time.LocalDateTime - value-based класс.

Класс java.time.LocalDateTime использует календарную систему ISO-8601, что может вызвать проблемы в приложениях работающих с историческими датами.

Page 24: Date & Time in Java SE 8

Java 8: Date & Time

TimeZone - регион использующий одинаковый стандарт времени.

ZoneId - идентификатор часового пояса, предоставляющий правила преобразования между Instant и LocalDateTime.

ZoneOffset - определяет смещение часового пояса относительно Greenwich/UTC

Page 25: Date & Time in Java SE 8

Java 8: Date & Time

java.time.ZonedDateTime - хранит информации о дате и времени, с указанием временной зоны. Представляется с точностью до наносекунд.

ZonedDateTime.now(); => 2014-02-25T02:09:53.321+03:00[Europe/Minsk]

Page 26: Date & Time in Java SE 8

Java 8: Date & Time

Внимание!

Класс java.time.ZonedDateTime - value-based класс.

Page 27: Date & Time in Java SE 8

Java 8: Date & Time

java.time.OffsetDateTime - хранит информацию о дате и времени, с указанием смещения относительно Greenwich/UTC. Представляется с точностью до наносекунд.

OffsetDateTime.now(); => 2014-02-25T02:13:34.737+03:00

Page 28: Date & Time in Java SE 8

Java 8: Date & Time

Внимание!

Класс java.time.OffsetDateTime - value-based класс.

Page 29: Date & Time in Java SE 8

Java 8: Date & Time

java.time.OffsetTime - хранит информаци о времени, с указанием смещения относительно Greenwich/UTC. Представляется с точностью до наносекунд.

OffsetTime.now(); => 02:15:50.779+03:00

Page 30: Date & Time in Java SE 8

Java 8: Date & Time

Внимание!

Класс java.time.OffseTime - value-based класс.

Page 31: Date & Time in Java SE 8

Java 8: Date & Time

java.time.Instant - временная метка. Представляется с точностью до наносекунд.

Instant.now(); => 2014-02-24T23:18:45.866Z

Page 32: Date & Time in Java SE 8

Java 8: Date & Time

Внимание!

Класс java.time.Instant - value-based класс.

UTC использует концепцию високосных секунд. Java Time API использует собственную шкалу Java Time-Scale, которая для значений времени начиная с 1972-11-03 идентична UTC-SLS.

Page 33: Date & Time in Java SE 8

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

Page 34: Date & Time in Java SE 8

Java 8: Date & Time

Внимание!

Класс java.time.Duration - value-based класс.

Page 35: Date & Time in Java SE 8

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

Page 36: Date & Time in Java SE 8

Java 8: Date & Time

Внимание!

Класс java.time.Period - value-based класс.

Page 37: Date & Time in Java SE 8

Java 8: Date & Time

Value-based классы:- equals, hashCode, и toString опираются на конкретное состояние объекта, а на класс, который он представляет

- не сравнивайте объекты данного рода при помощи сравнения их ссылок (==)

- используйте для сравнения объектов данного рода только метод equals()

Page 38: Date & Time in Java SE 8

Java 8: Date & Time

Value-based классы:- конструкторы отсутствуют, есть только фабричные методы

- свободно заменяемые (любые два X и Y равные согласно equals(), при любых вычислениях и вызовах методов не должны производить никаких видимых изменение в поведении)

Page 39: Date & Time in Java SE 8

Java 8: Date & Time

java.time.Clock - абстрактный класс для доступа к временной метке, времени и дате с учетом часового пояса.

Page 40: Date & Time in Java SE 8

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)) { ... } }}

Page 41: Date & Time in Java SE 8

Java 8: Date & Time

java.time.Clock - Текущие методы могут использоваться для тестирования:Clock.offset(Clock, Duration)Clock.systemUTC() Clock.fixed(Instant, ZoneId)

Page 42: Date & Time in Java SE 8

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

Page 43: Date & Time in Java SE 8

Java 8: Date & Time

java.time.format.DateTimeFormatter - используется для форматирования и парсинга значений даты и времени.Для этого используются методы format() и parse() соответственно.

java.time.format.DateTimeFormatter позволяет использовать предопределенные форматы даты и времени, либо определять собственные.

Page 44: Date & Time in Java SE 8

Java 8: Date & Time

Основные классы java.time определяют собственные методы для форматирования и парсинга значений даты и времени.

Page 45: Date & Time in Java SE 8

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

Page 46: Date & Time in Java SE 8

Java 8: Date & Time

Стандартизованные префиксы имен методов:

of with

from plus

parse minus

format to

get at

is

Page 47: Date & Time in Java SE 8

Java 8: Date & Time

Стандартизованные префиксы имен методов:of - создаем экземпляр объекта указанного класса,по набору параметров. Входные данные проверяются, но не конвертируются.

LocalDate localDate = LocalDate.of(1986, Month.JUNE, 5);localDate => 1986-06-05

Page 48: Date & Time in Java SE 8

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

Page 49: Date & Time in Java SE 8

Java 8: Date & Time

Стандартизованные префиксы имен методов:parse - создаем экземпляр объекта указанного класса из входной строки

LocalDate.parse("2014-12-23") => 2014-12-23

Page 50: Date & Time in Java SE 8

Java 8: Date & Time

Стандартизованные префиксы имен методов:format - форматируем строку согласно указанному формату

LocalDate localDate = LocalDate.now();localDate => 2014-02-16localDate.format(DateTimeFormatter.BASIC_ISO_DATE)) => 20140216

Page 51: Date & Time in Java SE 8

Java 8: Date & Time

Стандартизованные префиксы имен методов:get - берем элемент состояния объекта

LocalDate.now().getYear() => 2014

Page 52: Date & Time in Java SE 8

Java 8: Date & Time

Стандартизованные префиксы имен методов:is - спрашиваем состояние объекта

LocalDate.now().isLeapYear() => false

Page 53: Date & Time in Java SE 8

Java 8: Date & Time

Стандартизованные префиксы имен методов:with - возвращаем копию объекта с одним измененным элементом состояния

LocalDate localDate = LocalDate.now();localDate => 2014-02-16localDate.withYear(2016) => 2016-02-16

Page 54: Date & Time in Java SE 8

Java 8: Date & Time

Стандартизованные префиксы имен методов:plus - возвращаем копию объекта с одним увеличенным элементом состояния

LocalDate localDate = LocalDate.now();localDate => 2014-02-16localDate.plusDays(14) => 2014-03-02

Page 55: Date & Time in Java SE 8

Java 8: Date & Time

Стандартизованные префиксы имен методов:minus - возвращаем копию объекта с одним уменьшенным элементом состояния

LocalDate localDate = LocalDate.now();localDate => 2014-02-16localDate.minusYears(15) => 1999-02-16

Page 56: Date & Time in Java SE 8

Java 8: Date & Time

Cтандартизованные префиксы имен методов:to - конвертируем текущий объект в объект другого типа

LocalDateTime localDateTime = LocalDateTime.now(Clock.systemUTC());localDateTime => 2014-02-16T00:51:35.731localDateTime.toLocalDate() => 2014-02-16

Page 57: Date & Time in Java SE 8

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

Page 58: Date & Time in Java SE 8

Java 8: Date & Time

Совместимость со старым кодом:Calendar.toInstant(): Calendar -> Instant

GregorianCalendar.toZonedDateTime(): GregorianCalendar -> ZonedDateTime

GregorianCalendar.from(ZonedDateTime): ZonedDateTime -> GregorianCalendar (с использованием дефолтной локали)

Page 59: Date & Time in Java SE 8

Java 8: Date & Time

Совместимость со старым кодом:Date.from(Instant):Instant -> Date

Date.toInstant():Date -> Instant

TimeZone.toZoneId():TimeZone -> ZoneId

Page 60: Date & Time in Java SE 8

Java 8: Date & Time

Работа с базой данных:ANSI SQL Java SE 8

DATE LocalDate

TIME LocalTime

TIMESTAMP LocalDateTime

TIME WITH TIMEZONE OffsetTime

TIMESTAMP WITH TIMEZONE OffsetDateTime

Page 61: Date & Time in Java SE 8

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

Page 62: Date & Time in Java SE 8

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/