Slide 1

Slide 1 text

Introduction to Date and Time API HASUNUMA Kenji Vice president, GlassFish Users Group Japan k.hasunuma@coppermine.jp Twitter: @btnrouge November 10, 2012

Slide 2

Slide 2 text

Javaʹ͓͚Δ೔෇ɾ࣌ࠁͷѻ͍ JDK 1.1 Ҏ߱ɺຊ࣭తʹ͸มԽͳ͠

Slide 3

Slide 3 text

java.util.Date (JDK 1.0) wANSI/ISO Cͱػೳతʹಉ౳ wUTCPSϩʔΧϧλΠϜκʔϯ w೥݄೔࣌෼ඵΛऔಘɾઃఆՄ w೔෇ͱ࣌ࠁΛಉ͡ΫϥεͰද͢

Slide 4

Slide 4 text

java.util.Date (JDK 1.1) wࠃࡍԽରԠʜ࣮૷ΛCalendarϕʔεʹஔ ͖׵͑ w೥݄೔࣌෼ඵΛૢ࡞͢Δϝιου ͸͢΂ͯඇਪ঑ˠCalendarͰ୅ସ w೔෇ૢ࡞͸CalendarʹҠߦɺ%BUF͸೔ ࣌Λࢦ͚ࣔͩ͢͠

Slide 5

Slide 5 text

java.util.Dateͷ՝୊ wϑΟʔϧυૢ࡞͕໘౗ w ೥ϑΟʔϧυ͕࣮ࡍͷ೥ w ݄͕0͔Β࢝·Δ ݄ˠɺ݄ˠ w೔෇෦ͱ࣌ࠁ෦͕ࠞࡏ͍ͯ͠Δ w೔෇ԋࢉͱϑΥʔϚοτػೳ͕ශऑ

Slide 6

Slide 6 text

JSR 310 Date and Time API

Slide 7

Slide 7 text

Michael Nascimento Santos Stephen Colebourne Roger Riggs

Slide 8

Slide 8 text

JSR 310 : Date and Time API wDateɺCalendarɺDateFormat౳Λஔ͖ ׵͑Δ͜ͱ͕໨త wISO 8601ܗࣜͷ೔෇ɾ࣌ࠁදݱ wImmutable͔ͭεϨουηʔϑͳAPI wઃܭࢥ૝͸Joda-Timeʹࠅࣅ

Slide 9

Slide 9 text

Joda-Time JSR 310

Slide 10

Slide 10 text

Second System Syndrome

Slide 11

Slide 11 text

More simply

Slide 12

Slide 12 text

JSR 310 : Date and Time API 2007೥2݄JSR 310ঝೝɺEGൃ଍ 2008೥5݄JavaOne 2008Ͱൃද 2010೥3݄Early Draft Review (1ճ໨) 2012೥10݄Early Draft Review (2ճ໨) 2013೥10݄ Java SE 8ϦϦʔε

Slide 13

Slide 13 text

java.util.Date JSR 310 ΦϒδΣΫτ Mutable Immutable ਫ਼౓ ϛϦඵ φϊඵ ϑΟʔϧυR/W Calendarܦ༝ ௚઀αϙʔτ λΠϜκʔϯ αϙʔτ αϙʔτ toString໭Γ஋ Unixܗࣜ ISO 8601ܗࣜ ೔෇ͱ࣌ࠁͷ෼཭ ෆՄ Մೳ ೔෇ԋࢉ ൺֱͷΈ ༷ʑͳ೔෇ԋࢉ ؔ࿈Ϋϥε਺ ਺ݸ ͨ͘͞Μ

Slide 14

Slide 14 text

ϝϦοτ w݄1ʙ12 Date, Calendar͸0ʙ11 wtoStringͰISO 8601ܗࣜΛฦ͢ w೔෇ͱ࣌ࠁΛ෼཭͢Δ͜ͱ͕Ͱ͖Δ wଟ༷ͳ೔෇ԋࢉػೳΛ࣋ͭ wεϨουηʔϑͰ͋Δ

Slide 15

Slide 15 text

σϝϦοτ w αΠζ͕େ͖͍ Ϋϥε਺͕ଟ͍ 
 ˠJava SE APIͷதͰ΋࠷େڃ w طଘAPIͱͷޓ׵ੑʹ๡͍͠ w ࠓޙͷల։ JPA΍JAXB΁ͷରԠ ͕ෆ໌ྎ w Early Draft Reviewޙ΋සൟͳ࢓༷มߋ

Slide 16

Slide 16 text

ࢀߟ: ISO 8601ܗࣜ w ೔෇yyyy-MM-dd • 2012-11-10 w ࣌ࠁhh:mm:ss.SSSZ • 07:30:00.000Z w ೔࣌yyyy-MM-dd’T’HH:mm:ss.SSSZ • 2012-11-10T07:30:00.000Z

Slide 17

Slide 17 text

JSR 310 Essentials

Slide 18

Slide 18 text

Ϛγϯ޲͚ͷදݱ ಺෦දݱ • Instant • Duration • Clock ਓؒ޲͚ͷදݱ ֎෦දݱ • DateTime • Period • Chronology

Slide 19

Slide 19 text

Instant

Slide 20

Slide 20 text

Duration

Slide 21

Slide 21 text

Clock

Slide 22

Slide 22 text

DateTime : ೔෇ɾ࣌ࠁΫϥε • DateTimeΠϯλϑΣʔεͷ࣮૷ • ݱࡏ೔࣌·ͨ͸೚ҙͷ೔͔࣌Βੜ੒ • DateTimeͷԋࢉ(plus/minus)͓Αͼଞͷ DateTime͔Βͷม׵Λαϙʔτ • InstantʹରԠ͢Δਓؒ޲͚දݱ

Slide 23

Slide 23 text

DateTimeΠϯλϑΣʔεͷ࣮૷ • LocalDate, LocalTime, LocalDateTime • OffsetDate, OffsetTime, OffsetDateTime • ZonedDateTime • ෆ଍৘ใͷ௥Ճ·ͨ͸༨৒৘ใͷ੾Γࣺ ͯʹΑΓ૬ޓʹม׵Մ

Slide 24

Slide 24 text

%BUF 5JNF %BUF5JNF -PDBM ೥݄೔ ! ࣌ࠩ৘ใͳ͠ ! ࣌෼ඵະຬ ࣌ࠩ৘ใͳ͠ ೥݄೔ ࣌෼ඵະຬ ࣌ࠩ৘ใͳ͠ 0⒎TFU ೥݄೔ ! 65$͔Βͷ࣌ࠩ ! ࣌෼ඵະຬ 65$͔Βͷ࣌ࠩ ೥݄೔ ࣌෼ඵະຬ 65$͔Βͷ࣌ࠩ ;POFE /" /" ೥݄೔ ࣌෼ඵະຬ λΠϜκʔϯ

Slide 25

Slide 25 text

OffsetDateTime vs. ZonedDateTime wOffsetDateTimeUTC͔Βͷ࣌ࠩ wZonedDateTime࣮ࡍͷλΠϜκʔϯ ˞λΠϜκʔϯʹΑͬͯ͸͕࣌ࠩมಈ͢Δ wՆ࣌ؒಋೖࠃͰ͸ຖ೥ൃੜ wλΠϜκʔϯͷ࣌ࠩͷมߋ

Slide 26

Slide 26 text

Period : ظؒΫϥε wظؒΛද͢ ྫϲ݄ͱ೔ͱ࣌ؒ wϑΟʔϧυ௚઀ࢦఆɺͭͷDateTimeɺ Duration͔Βੜ੒ wϑΟʔϧυऔಘɺPeriodͷplus/minusɺ Duration΁ͷม׵ͳͲΛαϙʔτ wDurationʹରԠ͢Δਓؒ޲͚දݱ

Slide 27

Slide 27 text

Chronology : ྐྵΫϥε • ChronologyΫϥε:
 ྐྵͷ৘ใΛอ࣋ɺChronoDateΛੜ੒ • ChronoDateΫϥε:
 DateTimeΛϥοϓ֤ͯ͠ʑͷྐྵʹม׵
 ˞࠷৽ͷ࣮૷Ͱ͸ෳ਺Ϋϥεʹ෼ׂ ChronoLocalDateɺChronoOffsetDateTime౳

Slide 28

Slide 28 text

ChronologyͷαϒΫϥε • ISOChronology - ISO 8601 ඪ४ • JapaneseChronology࿨ྐྵ ೔ຊ • ThaiBuddhistChronology෹ྐྵ λΠ • MinguoChronologyຽࠃلݩ ୆࿷ • HijrahChronologyΠεϥϜྐྵ

Slide 29

Slide 29 text

೔෇ɾ࣌ࠁԋࢉ wDateTimeɺPeriodɺInstantɺDuration͸ ͦΕࣗ਎͕ՃࢉɾݮࢉػೳΛ࣋ͭ wϑΟʔϧυΛද͢Ϋϥεɾྻڍܕ͕֤छ ԋࢉΛఏڙ w Yearˠ͏Δ͏೥൑ఆ w Monthˠ݄ͷ೔਺औಘ w DayOfWeekˠ༵೔औಘ

Slide 30

Slide 30 text

ϑΥʔϚοτػೳ wDateTimeFormatter:
 ग़ྗܗࣜΛΧελϚΠζ͢Δ wDateTimeFormatterBuilder͔Βൺֱత؆ ୯ʹDateTimeFormatterΛੜ੒Մೳ wjava.text.DateFormat͸JSR 310Ͱ͸࢖༻ Ͱ͖ͳ͍

Slide 31

Slide 31 text

Examples

Slide 32

Slide 32 text

ࠓ೔ͷ೔෇ΛऔಘˠEBUF LocalDate date = LocalDate.now();

Slide 33

Slide 33 text

೥݄೔ˠEBUF LocalDate date = 
 LocalDate.of(2012, 11, 10);

Slide 34

Slide 34 text

ࠓ೔ͷ೔෇ˠE ೔ޙͷ೔෇ˠE LocalDate d1 = LocalDate.now(); LocalDate d2 = d1.plusDays(3);

Slide 35

Slide 35 text

ࠓ೔ͷ೔෇ˠEBUF ࠓ೔ͷ࣌෼ˠEBUF5JNF LocalDate date = LocalDate.now(); LocalDateTime dateTime = 
 date.atTime(16, 30);

Slide 36

Slide 36 text

ࠓ೔ͷ೔࣌ˠEBUF5JNF ࠓ೔ͷ೔෇ˠEBUF LocalDateTime dateTime = 
 LocalDateTime.now(); LocalDate date =
 LocalDate.from(dateTime);

Slide 37

Slide 37 text

EBUF೥݄೔ ͏Δ͏೥ ˠMFBQUSVF LocalDate date = LocalDate.of(1992, 10, 8); boolean leap = Year.from(date).isLeap();

Slide 38

Slide 38 text

ࠓ೔ͷ೔෇ˠEBUF EBUFΛඪ४ग़ྗ΁ LocalDate date = LocalDate.now(); System.out.println(date.toString()); 2012-11-10 ग़ྗ݁Ռ

Slide 39

Slide 39 text

ࠓ೔ͷ೔෇ ࿨ྐྵ ˠEBUF JapaneseChronology chrono = JapaneseChronology.INSTANCE; ChronoLocalDate jdate = chrono.date(LocalDate.now()); System.out.println(jdate); H24-11-10 ग़ྗ݁Ռ

Slide 40

Slide 40 text

Compatibility

Slide 41

Slide 41 text

java.util.DateΛվम(OpenJDK8) wίϯετϥΫλDate(Instant instant)
 㱻ίϯετϥΫλDate(long date) wInstant toInstant()ϝιου
 㱻long getTime()ϝιου ˞java.util.Calendarʹ΋ಉ༷ͷվम

Slide 42

Slide 42 text

0⒎TFU%BUF5JNF͔Β*OTUBOUΛऔಘ औಘͨ͠*OTUBOU͔Β%BUFΛੜ੒ OffsetDateTime dateTime =
 OffsetDateTime.now(); Instant instant = 
 dateTime.toInstant(); Date date = new Date(instant);

Slide 43

Slide 43 text

ଞͷAPIͱͷ࿈ܞ wকདྷతʹ͸JPAɺJAXB౳΁ల։༧ఆ wͨͩ͠ݱ࣌఺Ͱ͸۩ମతΞΫγϣϯͳ͠ wJPA࿈ܞ͸ૣظ࣮ݱΛ໨ࢦͯ͠ܭըதɺ ͱͷ͜ͱ ͍ͭʹͳΔ͜ͱ΍Βʜ

Slide 44

Slide 44 text

Conclusion

Slide 45

Slide 45 text

JSR 310ͱ͸Կͳͷ͔ wJSR 310͸java.util.Dateͷܽ఺Λ͢΂ͯ ղܾ͠Α͏ͱ͢Δ໺৺తࢼΈ wաڈͱͷޓ׵ੑΛஅͪ੾Δ͜ͱͰɺ೔ ෇ɾ࣌ࠁAPIͷཧ૝Λ௥ٻͨ͠ wਖ਼௚΍Γա͗ײ΋൱Ίͳ͍͕ɺطଘAPI ͷ໰୊఺ͷଟ͘Λղܾͨ͠఺͸ධՁ

Slide 46

Slide 46 text

JSR 310ͷϦιʔε JSR 310 Specification http://jcp.org/en/jsr/detail?id=310 JSR 310 RI “ThreeTen” http://threeten.sourceforge.net https://github.com/ThreeTen/threeten

Slide 47

Slide 47 text

Introduction to Date and Time API HASUNUMA Kenji k.hasunuma@coppermine.jp Twitter: @btnrouge