jdk8-threeten
DESCRIPTION
TRANSCRIPT
![Page 1: jdk8-threeten](https://reader033.vdocuments.us/reader033/viewer/2022051207/540de79a8d7f72747e8b4bdc/html5/thumbnails/1.jpg)
Brand new Date and Time API March 21, 2014
HASUNUMA [email protected]
http://www.coppermine.jp/Twitter: @khasunuma
![Page 2: jdk8-threeten](https://reader033.vdocuments.us/reader033/viewer/2022051207/540de79a8d7f72747e8b4bdc/html5/thumbnails/2.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022051207/540de79a8d7f72747e8b4bdc/html5/thumbnails/3.jpg)
What is time?“Time” is described by science approaches and defined by International Standard (SI) exactly.
Skip
![Page 4: jdk8-threeten](https://reader033.vdocuments.us/reader033/viewer/2022051207/540de79a8d7f72747e8b4bdc/html5/thumbnails/4.jpg)
![Page 5: jdk8-threeten](https://reader033.vdocuments.us/reader033/viewer/2022051207/540de79a8d7f72747e8b4bdc/html5/thumbnails/5.jpg)
Definition of second (Traditional)
![Page 6: jdk8-threeten](https://reader033.vdocuments.us/reader033/viewer/2022051207/540de79a8d7f72747e8b4bdc/html5/thumbnails/6.jpg)
Definition of second (Modern)
![Page 7: jdk8-threeten](https://reader033.vdocuments.us/reader033/viewer/2022051207/540de79a8d7f72747e8b4bdc/html5/thumbnails/7.jpg)
![Page 8: jdk8-threeten](https://reader033.vdocuments.us/reader033/viewer/2022051207/540de79a8d7f72747e8b4bdc/html5/thumbnails/8.jpg)
![Page 9: jdk8-threeten](https://reader033.vdocuments.us/reader033/viewer/2022051207/540de79a8d7f72747e8b4bdc/html5/thumbnails/9.jpg)
![Page 10: jdk8-threeten](https://reader033.vdocuments.us/reader033/viewer/2022051207/540de79a8d7f72747e8b4bdc/html5/thumbnails/10.jpg)
PST (Pacific Standard Time) Offset:-08:00 (Summer:-07:00)
JST (Japan Standard Time) Offset:+09:00
Skip
![Page 11: jdk8-threeten](https://reader033.vdocuments.us/reader033/viewer/2022051207/540de79a8d7f72747e8b4bdc/html5/thumbnails/11.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022051207/540de79a8d7f72747e8b4bdc/html5/thumbnails/12.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022051207/540de79a8d7f72747e8b4bdc/html5/thumbnails/13.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022051207/540de79a8d7f72747e8b4bdc/html5/thumbnails/14.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022051207/540de79a8d7f72747e8b4bdc/html5/thumbnails/15.jpg)
ISO 8601Date elements and interchange formats - Information interchange - Representation of dates and times
Skip
![Page 16: jdk8-threeten](https://reader033.vdocuments.us/reader033/viewer/2022051207/540de79a8d7f72747e8b4bdc/html5/thumbnails/16.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022051207/540de79a8d7f72747e8b4bdc/html5/thumbnails/17.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022051207/540de79a8d7f72747e8b4bdc/html5/thumbnails/18.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022051207/540de79a8d7f72747e8b4bdc/html5/thumbnails/19.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022051207/540de79a8d7f72747e8b4bdc/html5/thumbnails/20.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022051207/540de79a8d7f72747e8b4bdc/html5/thumbnails/21.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022051207/540de79a8d7f72747e8b4bdc/html5/thumbnails/22.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022051207/540de79a8d7f72747e8b4bdc/html5/thumbnails/23.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022051207/540de79a8d7f72747e8b4bdc/html5/thumbnails/24.jpg)
Origin of week
![Page 25: jdk8-threeten](https://reader033.vdocuments.us/reader033/viewer/2022051207/540de79a8d7f72747e8b4bdc/html5/thumbnails/25.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022051207/540de79a8d7f72747e8b4bdc/html5/thumbnails/26.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022051207/540de79a8d7f72747e8b4bdc/html5/thumbnails/27.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022051207/540de79a8d7f72747e8b4bdc/html5/thumbnails/28.jpg)
JSR 310Date and Time API
Skip
![Page 29: jdk8-threeten](https://reader033.vdocuments.us/reader033/viewer/2022051207/540de79a8d7f72747e8b4bdc/html5/thumbnails/29.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022051207/540de79a8d7f72747e8b4bdc/html5/thumbnails/30.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022051207/540de79a8d7f72747e8b4bdc/html5/thumbnails/31.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022051207/540de79a8d7f72747e8b4bdc/html5/thumbnails/32.jpg)
Date and Time conversions
![Page 33: jdk8-threeten](https://reader033.vdocuments.us/reader033/viewer/2022051207/540de79a8d7f72747e8b4bdc/html5/thumbnails/33.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022051207/540de79a8d7f72747e8b4bdc/html5/thumbnails/34.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022051207/540de79a8d7f72747e8b4bdc/html5/thumbnails/35.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022051207/540de79a8d7f72747e8b4bdc/html5/thumbnails/36.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022051207/540de79a8d7f72747e8b4bdc/html5/thumbnails/37.jpg)
Chronology supports
Chronology Era ChronoLocalDate
IsoChronology IsoEra LocalDate
JapaneseChronology JapaneseEra JapaneseDate
MinguoChronology MinguoEra MinguoDate
ThaiBuddhistChronology ThaiBuddhistEra ThaiBuddhistDate
HijrahChronology HijrahEra HijrahDate
![Page 38: jdk8-threeten](https://reader033.vdocuments.us/reader033/viewer/2022051207/540de79a8d7f72747e8b4bdc/html5/thumbnails/38.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022051207/540de79a8d7f72747e8b4bdc/html5/thumbnails/39.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022051207/540de79a8d7f72747e8b4bdc/html5/thumbnails/40.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022051207/540de79a8d7f72747e8b4bdc/html5/thumbnails/41.jpg)
External representation(for Human)
![Page 42: jdk8-threeten](https://reader033.vdocuments.us/reader033/viewer/2022051207/540de79a8d7f72747e8b4bdc/html5/thumbnails/42.jpg)
Internal representation(for Machine)
![Page 43: jdk8-threeten](https://reader033.vdocuments.us/reader033/viewer/2022051207/540de79a8d7f72747e8b4bdc/html5/thumbnails/43.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022051207/540de79a8d7f72747e8b4bdc/html5/thumbnails/44.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022051207/540de79a8d7f72747e8b4bdc/html5/thumbnails/45.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022051207/540de79a8d7f72747e8b4bdc/html5/thumbnails/46.jpg)
ExamplesMore examples: https://github.com/btnrouge/threetensamples
Skip
![Page 47: jdk8-threeten](https://reader033.vdocuments.us/reader033/viewer/2022051207/540de79a8d7f72747e8b4bdc/html5/thumbnails/47.jpg)
// It is assumed to run at March 21, 2014 LocalDate today = LocalDate.new(); !System.out.println(today);
2014-03-21
![Page 48: jdk8-threeten](https://reader033.vdocuments.us/reader033/viewer/2022051207/540de79a8d7f72747e8b4bdc/html5/thumbnails/48.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022051207/540de79a8d7f72747e8b4bdc/html5/thumbnails/49.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022051207/540de79a8d7f72747e8b4bdc/html5/thumbnails/50.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022051207/540de79a8d7f72747e8b4bdc/html5/thumbnails/51.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022051207/540de79a8d7f72747e8b4bdc/html5/thumbnails/52.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022051207/540de79a8d7f72747e8b4bdc/html5/thumbnails/53.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022051207/540de79a8d7f72747e8b4bdc/html5/thumbnails/54.jpg)
// 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](https://reader033.vdocuments.us/reader033/viewer/2022051207/540de79a8d7f72747e8b4bdc/html5/thumbnails/55.jpg)
Brand new Date and Time API March 21, 2014
HASUNUMA [email protected]
http://www.coppermine.jp/Twitter: @khasunuma