+ All Categories
Home > Technology > jdk8-threeten

jdk8-threeten

Date post: 08-Sep-2014
Category:
Upload: kenji-hasunuma
View: 7,987 times
Download: 0 times
Share this document with a friend
Description:
 
Popular Tags:
55
Brand new Date and Time API March 21, 2014 HASUNUMA Kenji [email protected] http://www.coppermine.jp/ Twitter: @khasunuma
Transcript
Page 1: jdk8-threeten

Brand new Date and Time API March 21, 2014

HASUNUMA [email protected]

http://www.coppermine.jp/Twitter: @khasunuma

Page 2: jdk8-threeten

Preface• JSR 310 is a new and improved date and time API

for Java.

• It is based on ISO 8601 standard.

• The reference implementation is called "ThreeTen".

• Specification Leads: Stephen Colebourne, Michael Nascimento Santos and Roger Riggs.

Page 3: jdk8-threeten

What is time?“Time” is described by science approaches and defined by International Standard (SI) exactly.

Skip

Page 4: jdk8-threeten
Page 5: jdk8-threeten

Definition of second (Traditional)

Page 6: jdk8-threeten

Definition of second (Modern)

Page 7: jdk8-threeten
Page 8: jdk8-threeten
Page 9: jdk8-threeten
Page 10: jdk8-threeten

PST (Pacific Standard Time) Offset:-08:00 (Summer:-07:00)

JST (Japan Standard Time) Offset:+09:00

Skip

Page 11: jdk8-threeten

Time zones (East 1/2)

Code Name Offset SummerECT Europe/Paris +01:00 +02:00CAT Africa/Harare +02:00 (N/A)ART Africa/Cairo +02:00 (N/A)EAT Africa/Addis_Abeba +03:00 (N/A)NET Asia/Yerevan +04:00 (N/A)PLT Asia/Karachi +05:00 (N/A)IST Asia/Koltaka +05:30 (N/A)BST Asia/Dacca +06:00 (N/A)

Page 12: jdk8-threeten

Time zones (East 2/2)

Code Name Offset SummerVST Asia/Ho_Chi_Minh +07:00 (N/A)CTT Asia/Shanghai +08:00 (N/A)JST Asia/Tokyo +09:00 (N/A)ACT Australia/Darwin +09:30 (N/A)AET Australia/Sydney +11:00 +10:00SST Pacific/Guadalcanal +11:00 (N/A)NST Pacific/Auckland +13:00 +12:00MIT Pacific/Apia +14:00 +13:00

Page 13: jdk8-threeten

Time zones (West 1/2)

Code Name Offset Summer

BET America/Sao_Paulo -02:00 -03:00

AGT America/Argentina/Buenos_Aires -03:00 (N/A)

CNT America/St_Johns -03:30 -02:30

PRT America/Puerto_Rico -04:00 (N/A)

EST (N/A) -05:00 (N/A)

IET America/Indiana/Indianapolis -05:00 -04:00

Page 14: jdk8-threeten

Time zones (West 2/2)

Code Name Offset Summer

CST America/Chicago -06:00 -05:00

MST (N/A) -07:00 (N/A)

PNT America/Phoenix -07:00 (N/A)

PST America/Los_Angeles -08:00 -07:00

AST America/Anchorage -09:00 -08:00

HST (N/A) -10:00 (N/A)

Page 15: jdk8-threeten

ISO 8601Date elements and interchange formats - Information interchange - Representation of dates and times

Skip

Page 16: jdk8-threeten

What’s ISO 8601?

• International standard for representation of dates and times, using information interchange.

• Based on Gregorian calendar system (1582).

• JIS X 0301 is Japanese translations with remarks about Japanese chronology.

• ISO 8601 and Unix time are incompatible. Unix time is basis of java.util.Date, et al.

Page 17: jdk8-threeten

Representation of time(w/o Time zone)

• hh:mm:ss e.g. 15:30:45

• hh:mm e.g. 15:30

• hh e.g. 15

• hh:mm:ss.s e.g. 15:30:45.250

Page 18: jdk8-threeten

Representation of time(w/Time zone)

• Add suffix based on the offset from UTC

• UTC: ‘Z’ e.g. 06:30:45Z

• Not UTC: +hh:mm or -hh:mme.g. 15:30:45+09:00 (JST, Asia/Tokyo) 02:30:45-08:00 (PST, America/Los_Angeles)

Page 19: jdk8-threeten

Representation of date• date - it consists with year, month, day and week.

• calendar date YYYY-MM-DD e.g. 2014-03-21 • ordinal date YYYY-DDD e.g. 2014-080 • week date YYYY-Www-D e.g. 2014-W12-5

• Short representations: • year-month YYYY-MM e.g. 2014-03 • year YYYY e.g. 2014 • century YY e.g. 20 • month-day --MM-DD e.g. --03-21

Page 20: jdk8-threeten

Definition of day• a day = 24 hours = 86,400 seconds

• 00:00~24:00 (24:00 is same as next 00:00)

• Exceptions:

• Leap seconds

• Begin and end of summer time

• When the time zone is changed

Page 21: jdk8-threeten

Definition of month• a month = 28, 29, 30 or 31 days

1 January 01~31 7 July 01~31

2 February 01~28/29 8 August 01~31

3 March 01~31 9 September 01~30

4 April 01~30 10 October 01~31

5 May 01~31 11 November 01~30

6 June 01~30 12 December 01~31

Page 22: jdk8-threeten

Definition of year• a year = approximation days while the orbital period

of Earth (365.242 19 days), 12 months. • common year = 365 days • leap year = 366 days

• 0000~9999 (0000~1582 is reserved)

mod 4 mod 100 mod 400 yearNot Zero - - common year

Zero Not Zero - leap yearZero Zero Not Zero common yearZero Zero Zero leap year

Page 23: jdk8-threeten

Definition of week

• a week = 7 days

• 1st week of year = a week contents the first Thursday of the year.

• a year contents 52 or 53 weeks.

1 Monday

2 Tuesday

3 Wednesday

4 Thursday

5 Friday

6 Saturday

7 Sunday

Page 24: jdk8-threeten

Origin of week

Page 25: jdk8-threeten

Representation of date and time

• concat date and time by 'T'.

• YYYY-MM-DDThh:mm:ss[Time zone]

• Alt. YYYY-DDDThh:mm:ss[Time Zone]

• e.g. 2014-03-21T06:30 2014-03-21T15:30:45+09:00 2014-079T02:30:45-08:00

Page 26: jdk8-threeten

Definition and representation of duration

• time amount between two time points

• date : nYnMnD e.g. 1Y3M22D

• time : nHnMnS e.g. 9H30M45S

• date and time : nYnMnDTnHnMnSe.g. 1Y3M22DT9H30M45S

Page 27: jdk8-threeten

Definition and representation of period

• range between two dates (adopt also two times)

• two dates : YYYY-MM-DD/YYYY-MM-DDe.g. 2013-12-31/2014-03-21

• start date and duration : YYYY-MM-DD/PnYnMnDe.g. 2013-12-31/P1Y3M22D

• end date and duration : PnYnMnD/YYYY-MM-DDe.g. P1Y3M22D/2013-03-21

• duration : PnYnMnDe.g. P1Y3M22D

Page 28: jdk8-threeten

JSR 310Date and Time API

Skip

Page 29: jdk8-threeten

JSR 310 : Date and Time API• Since 2007, Reference Implementation: ThreeTen

• Relational projects:

• ThreeTen-Extra: Features dropped from JDK8, i.e. UTC/TAI full support, Coptic chronology, et al.https://github.com/ThreeTen/threeten-extra

• ThreeTen-Backport: JSR 310 like API for JDK7. https://github.com/ThreeTen/threetenbp

• Joda-Time: Provides many hints to JSR 310.http://www.joda.org/joda-time/

Page 30: jdk8-threeten

Package java.time.*

Package Description Use

java.time Basic classes usually

java.time.format Date and Time Formatter often

java.time.chrono Chronology supports partially

java.time.temporal Low-level API rarely

java.time.zone Low-level API rarely

Page 31: jdk8-threeten

Date and Time classes

Class Field Time zone ISO 8601 Chrono.

LocalDate Date N/A compatible enable

LocalDateTime Date + Time N/A compatible enable

LocalTime Time N/A compatible N/A

OffsetDateTime Date + Time offset compatible disable

OffsetTime Time offset compatible N/A

ZonedDateTime Date + Time zone id extended enable

Page 32: jdk8-threeten

Date and Time conversions

Page 33: jdk8-threeten

Date and Time conversionsOper. Description

of-Create from fields. e.g. LocalDate today = LocalDate.of(2014, 3, 21); // today.toString() : “2014-03-21”

at-Expand with fields. e.g. LocalDateTime current = today.atTime(15:30); // current.toString() : “2014-03-21T15:30:00”

to-Truncate fields. e.g. LocalDate someday = current.toLocalDate(); // someday.toString() : “2014-03-21”

Page 34: jdk8-threeten

Date and Time operatorsOper. Description

isBefore isEqual isAfter

Compare with other date/time. e.g. LocalDate today = LocalDate.of(2014, 3, 21); boolean b = today.isAfter(LocalDate.of(2014, 3, 19)); // b == true

plus- minus-

Add/subtract field value. e.g. LocalDate tomorrow = today.plusDays(2); // tomorrow.toString() : “2014-03-23”

isLeapYearVerify a date is leap year. e.g. boolean leap = today.isLeapYear(); // leap == false

Page 35: jdk8-threeten

Date and Time formattingMethod Description

toString()Format using default formatter. e.g. String s = today.toString(); // s : “2014-03-21”

format(DateTimeFormatter f) Format using custom formatter. e.g. String s = today.format(formatter);

parse(String s)Parse using default formatter. e.g. LocalDate d = LocalDate .parse(“2014-03-21”);

parse(String s, DateTimeFormatter f)

Parse using custom formatter. e.g. LocalDate d = LocalDate .parse(“2014-03-21”, formatter);

Page 36: jdk8-threeten

Chronology

• Date and Time API supports ISO 8601 and some local chronology (e.g., Japanese Era, Minguo Era, Thai Buddhist Era and Hijrah Era).

• ChronoLocalDate and its sub-classes (incl. LocalDate) support chronology.

• ChronoLocalDateTime<D>/ChronoZonedDateTime<D> instead of LocalDateTime/ZonedDateTime

• dates/times that have different chronology can convert by from method each other.

Page 37: jdk8-threeten

Chronology supports

Chronology Era ChronoLocalDate

IsoChronology IsoEra LocalDate

JapaneseChronology JapaneseEra JapaneseDate

MinguoChronology MinguoEra MinguoDate

ThaiBuddhistChronology ThaiBuddhistEra ThaiBuddhistDate

HijrahChronology HijrahEra HijrahDate

Page 38: jdk8-threeten

Chronology examplesLocalDate today = LocalDate.of(2014, 3, 21); System.out.println(today); System.out.println(JapaneseDate.from(today)); System.out.println(MinguoDate.from(today)); System.out.println(ThaiBuddhistDate.from(today)); System.out.println(HijrahDate.from(today));

2014-03-21 Japanese Heisei 26-03-21 Minguo ROC 103-03-21 ThaiBuddhist BE 2557-03-21 Hijrah-umalqura AH 1435-05-20

Page 39: jdk8-threeten

DateTimeFormatter• Provides formats date/time.

• Created by ofPattern method (basic way)e.g. DateTimeFormatter.ofPattern(“yyyy/MM/dd”)

• Created by DateTimeFormatterBuilder (full control)

• Pre-defined patterns (static fields) • ISO_LOCAL_DATE // ofPattern(“yyyy-MM-dd”)

• ISO_ORDINAL_DATE // ofPattern(“yyyy-ddd”)

• ISO_WEEK_DATE // ofPattern(“yyyy-Www”)

Page 40: jdk8-threeten

Chronology and Formattere.g. JapaneseDate

pattern display example

"YYYY/MM/dd" 2014/03/21

"Y/M/d" 2014/3/21

"GGGGGyy.MM.dd" H26.03.21

"Gy年M月d日(E)" 平成26年3月21日(金)

Page 41: jdk8-threeten

External representation(for Human)

Page 42: jdk8-threeten

Internal representation(for Machine)

Page 43: jdk8-threeten

Instant• Representation of a time-point.

• The precision is a nano second.

• The epoch is 1970-01-01T00:00:00Z

• Convert from/to LocalDateTime, OffsetDateTime or ZonedDateTime.

• Convert from/to java.util.Date, which means that Instant is the only interface to java.util.Date.

Page 44: jdk8-threeten

Duration and Period• Representations of period (ISO 8601).

• Period (JSR 310) is a period (ISO 8601) between two dates and represents as a date-scale.i.e. format as "P1Y2M3D"

• Duration (JSR 310) is a period (ISO 8601) between any two temporals and represents as a time-scale.i.e. format as "PT15H30M45D"

• Attention: those definitions are different from them of ISO 8601.

Page 45: jdk8-threeten

Clock and now method• Provider of the current instant.

• There are some clocks, having relation of zones (incl. current zone), fixed clock (for testing) and custom.

• By default, it uses the clock of current zone.

• now method (LocalDate, et al.) creates a temporal instance from a clock. e.g. LocalDate.now(); LocalDate.now(zoneId); LocalDate.now(Clock.fixed(instant, ZoneId.systemDefault);

Page 46: jdk8-threeten

ExamplesMore examples: https://github.com/btnrouge/threetensamples

Skip

Page 47: jdk8-threeten

// It is assumed to run at March 21, 2014 LocalDate today = LocalDate.new(); !System.out.println(today);

2014-03-21

Page 48: jdk8-threeten

LocalDate calendarDate = LocalDate.of(2014, 3, 21); LocalDate ordinalDate = LocalDate.ofYearDays(2014, 80); LocalDateTime localDateTime = LocalDateTime.of(2014, 3, 21, 15, 30); !System.out.println(calendarDate); System.out.println(ordinalDate); System.out.println(localDateTime);

2014-03-21 2014-03-21 2014-03-21T15:30

Page 49: jdk8-threeten

OffsetDateTime offsetDateTime = OffsetDateTime.of(2014, 3, 21, 15, 30, 45, 0, ZoneOffset.ofHours(9)); ZonedDateTime zonedDateTime = ZonedDateTime.of(2014, 3, 21, 15, 30, 45, 0, ZoneId.of("Asia/Tokyo")); !System.out.println(offsetDateTime); System.out.println(zonedDateTime);

2014-03-21T15:30:45+09:00 2014-03-21T15:30:45+09:00[Asia/Tokyo]

Page 50: jdk8-threeten

LocalDate localDate = LocalDate.of(2014, 3, 21); LocalDateTime localDateTime0 = localDate.atStartOfDay(); LocalDateTime localDateTime1 = localDate.atTime(15, 30, 45); OffsetDateTime offsetDateTime = localDateTime.atOffset( ZoneOffset.ofHours(9)); !System.out.println(localDateTime0); System.out.println(localDateTime1); System.out.println(offsetDateTime);

2014-03-21T00:00 2014-03-21T15:30:45 2014-03-21T15:30:45+09:00

Page 51: jdk8-threeten

OffsetDateTime offsetDateTime = OffsetDateTime.of(2014, 3, 21, 15, 30, 45, 0, ZoneOffset.ofHours(9)); LocalDate localDate = offsetDateTime.toLocalDate(); LocalTime localTime = offsetDateTime.toLocalTime(); !System.out.println(offsetDateTime); System.out.println(localDate); System.out.println(localTime);

2014-03-21T15:30:45+09:00 2014-03-21 15:30:45

Page 52: jdk8-threeten

LocalDate commonYearsDay = LocalDate.of(1990, 12, 19); LocalDate leapYearsDay = LocalDate.of(1992, 10, 8); LocalDate centuryDay = LocalDate.of(2000, 1, 1); !System.out.println( commonYearDay.isLeapYear()); System.out.println( leapYearDay.isLeap()); System.out.println( centuryDay.isLeapYear());

false true false

Page 53: jdk8-threeten

LocalDate today = LocalDate.of(2014, 3, 21); LocalDate lastWeek = today.minusWeeks(1L); LocalDate dayAfterTomorrow = today.plusDays(2L); Period period = lastWeek.until(dayAfterTomorrow); !System.out.println(yesterday); System.out.println(dayAftereTomorrow); System.out.println(period);

2014-03-20 2014-03-23 P9D

Page 54: jdk8-threeten

// Convert java.util.Date to LocalDateTime Date date = new Date(); !LocalDateTime localDateTime = LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault());

// Convert LocalDateTime to java.util.Date LocalDateTime localDateTime = LocalDateTime.now(); !Instant instant = localDateTime.atZone( ZoneId.systemDefault()).toInstant(); Date date = Date.from(instant);

Page 55: jdk8-threeten

Brand new Date and Time API March 21, 2014

HASUNUMA [email protected]

http://www.coppermine.jp/Twitter: @khasunuma


Recommended