Your SlideShare is downloading. ×
  • Like
jdk8-threeten
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Now you can save presentations on your phone or tablet

Available for both IPhone and Android

Text the download link to your phone

Standard text messaging rates apply

jdk8-threeten

  • 12,361 views
Published

 

Published in Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
12,361
On SlideShare
0
From Embeds
0
Number of Embeds
23

Actions

Shares
Downloads
46
Comments
0
Likes
18

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Brand new Date and Time API March 21, 2014 HASUNUMA Kenji khasunuma@java.net http://www.coppermine.jp/ Twitter: @khasunuma
  • 2. 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.
  • 3. What is time? “Time” is described by science approaches and defined by International Standard (SI) exactly. Skip
  • 4. Definition of second (Traditional)
  • 5. Definition of second (Modern)
  • 6. PST (Pacific Standard Time) Offset:-08:00 (Summer:-07:00) JST (Japan Standard Time) Offset:+09:00 Skip
  • 7. Time zones (East 1/2) Code Name Offset Summer ECT Europe/Paris +01:00 +02:00 CAT 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)
  • 8. Time zones (East 2/2) Code Name Offset Summer VST 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:00 SST Pacific/Guadalcanal +11:00 (N/A) NST Pacific/Auckland +13:00 +12:00 MIT Pacific/Apia +14:00 +13:00
  • 9. 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
  • 10. 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)
  • 11. ISO 8601 Date elements and interchange formats - Information interchange - Representation of dates and times Skip
  • 12. 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.
  • 13. 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
  • 14. 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:mm
 e.g. 15:30:45+09:00 (JST, Asia/Tokyo)
 02:30:45-08:00 (PST, America/Los_Angeles)
  • 15. 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
  • 16. 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
  • 17. 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
  • 18. 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 year Not Zero - - common year Zero Not Zero - leap year Zero Zero Not Zero common year Zero Zero Zero leap year
  • 19. 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
  • 20. Origin of week
  • 21. 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
  • 22. Definition and representation of duration • time amount between two time points • date : nYnMnD e.g. 1Y3M22D • time : nHnMnS e.g. 9H30M45S • date and time : nYnMnDTnHnMnS
 e.g. 1Y3M22DT9H30M45S
  • 23. Definition and representation of period • range between two dates (adopt also two times) • two dates : YYYY-MM-DD/YYYY-MM-DD
 e.g. 2013-12-31/2014-03-21 • start date and duration : YYYY-MM-DD/PnYnMnD
 e.g. 2013-12-31/P1Y3M22D • end date and duration : PnYnMnD/YYYY-MM-DD
 e.g. P1Y3M22D/2013-03-21 • duration : PnYnMnD
 e.g. P1Y3M22D
  • 24. JSR 310 Date and Time API Skip
  • 25. 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/
  • 26. 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
  • 27. 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
  • 28. Date and Time conversions
  • 29. Date and Time conversions Oper. 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”
  • 30. Date and Time operators Oper. 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” isLeapYear Verify a date is leap year. e.g. boolean leap = today.isLeapYear(); // leap == false
  • 31. Date and Time formatting Method 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);
  • 32. 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.
  • 33. Chronology supports Chronology Era ChronoLocalDate IsoChronology IsoEra LocalDate JapaneseChronology JapaneseEra JapaneseDate MinguoChronology MinguoEra MinguoDate ThaiBuddhistChronology ThaiBuddhistEra ThaiBuddhistDate HijrahChronology HijrahEra HijrahDate
  • 34. Chronology examples LocalDate 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
  • 35. 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”)
  • 36. Chronology and Formatter e.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日(金)
  • 37. External representation (for Human)
  • 38. Internal representation (for Machine)
  • 39. 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.
  • 40. 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.
  • 41. 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);
  • 42. Examples More examples: https://github.com/btnrouge/threetensamples Skip
  • 43. // It is assumed to run at March 21, 2014 LocalDate today = LocalDate.new(); ! System.out.println(today); 2014-03-21
  • 44. 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
  • 45. 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]
  • 46. 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
  • 47. 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
  • 48. 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
  • 49. 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
  • 50. // 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);
  • 51. Brand new Date and Time API March 21, 2014 HASUNUMA Kenji khasunuma@java.net http://www.coppermine.jp/ Twitter: @khasunuma