Slide 1

Slide 1 text

Introduction to Date and Time API II HASUNUMA Kenji GlassFish Community khasunuma@java.net Twitter: @khasunuma November 9, 2013 #ccc_r21

Slide 2

Slide 2 text

Time?

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

No content

Slide 7

Slide 7 text

No content

Slide 8

Slide 8 text

No content

Slide 9

Slide 9 text

No content

Slide 10

Slide 10 text

Representation of Date/Time

Slide 11

Slide 11 text

java.util.Date ANSI/ISO Cͷtime_tͱػೳతʹಉ౳ ݱࡏ͸೔෇ɾ࣌ࠁͷදݱͷΈʹప͢Δ ˞java.sql.Date౳ͷαϒΫϥε java.util.Calendar JavaͷࠃࡍԽରԠ(JDK 1.1)Ͱಋೖ ೔෇ɾ࣌ࠁͷ࡞੒ɾฤूʹ༻͍Δ ˞GregorianCalendar౳ͷαϒΫϥε java.time.* (JSR 310) JDK8~ɺDate/Calendar୅ସ͕౰ॳͷ໨ඪ ೔෇ɾ࣌ࠁΛ૯߹తʹѻ͏ϑϨʔϜϫʔΫ ˞ن໛͸JDK8ͷ৽APIͰ΋࠷େڃ ˞ͦͷଞɺXML DOM APIͷXMLGregorianCalendar͕͋Δ

Slide 12

Slide 12 text

java.util.Dateͷ՝୊ w ϑΟʔϧυૢ࡞͕໘౗ w ೥ϑΟʔϧυ+1900͕࣮ࡍͷ೥ w ݄͕͔Β࢝·Δ(1݄ˠ0ʜ12݄ˠ11) w ϑΟʔϧυͷ௚઀ૢ࡞͕ඇਪ঑(CalendarΛ࢖͏) w ೔෇෦ͱ࣌ࠁ෦͕ࠞࡏ͍ͯ͠Δ w ೔෇ԋࢉ͕ශऑɺϑΥʔϚοτػೳ΋࢖͍উखʹ೉ w +%,Ҏ߱ɺҰ෦ྫ֎Λআ͖ϝϯςφϯεͳ͠

Slide 13

Slide 13 text

java.util.Calendarͷ՝୊ w ϑΟʔϧυૢ࡞͕໘౗(DateΑΓ͸վળ) w ݄͕͔Β࢝·Δˠఆ਺Ͱ͓஡Λ୙͢ w ϑΟʔϧυૢ࡞ͷ࢖͍উख͕ΠϚΠν w ೔෇ԋࢉ͕ශऑʜͦΕͰ΋DateΑΓ͸ଟগϚγ w ೔෇ɾ࣌ࠁܕͱͯ͠ೝࣝ͞Εͳ͍͜ͱ΋ଟ͍
 ྫ: DateFormat ˠ Dateͱͷ૬ޓม׵Λར༻

Slide 14

Slide 14 text

java.util.Calendarͷվળ +%,ΑΓCalendar.BuilderΛಋೖ ˠϝιουνΣʔϯ ߦ Ͱ೔෇ɾ࣌ࠁΛදͤΔ // 2013೥11݄9೔Λද͢Calendar (since JDK8) Calendar calendar = new Calendar.Builder() .setDate(2013, NOVEMBER, 9) .setField(HOUR_OF_DAY, 9) .build();

Slide 15

Slide 15 text

JSR 310 Date and Time API

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

JSR 310ͷσϝϦοτ wJDK8 APIͷதͰ΋࠷େن໛(=ෳࡶ) wطଘAPIͱͷ૬ޓӡ༻ੑ͸Ψϯແࢹ w Dateͱͷ૬ޓม׵͸ൺֱత࠷ۙʹ࣮ݱ wࠓޙͷల։͕ෆ໌ྎ w JPA΍JAXB΁ͷల։͸ݕ౼த w গͳ͘ͱ΋JavaFX 8ʹ͸ؒʹ߹Θͣ

Slide 20

Slide 20 text

ࢀߟ: ISO 8601ܗࣜ w ೔෇yyyy-MM-dd • 2013-11-09 w ࣌ࠁhh:mm:ss.SSSZ • 04:05:00.000Z w ೔࣌yyyy-MM-dd’T’HH:mm:ss.SSSZ • 2013-11-09T04:05:00.000Z

Slide 21

Slide 21 text

JSR 310 Essentials

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

Ϛγϯ޲͚ͷදݱ(಺෦දݱ)

Slide 24

Slide 24 text

ਓؒ޲͚ͷදݱ(֎෦දݱ)

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

ओͳDateTimeͷ࣮૷ • LocalDate, LocalTime, LocalDateTime • OffsetTime, OffsetDateTime • ZonedDateTime • ෆ଍৘ใͷ௥Ճ·ͨ͸༨৒৘ใͷ੾Γ ࣺͯʹΑΓ૬ޓʹม׵Մ

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

OffsetDateTime vs. ZonedDateTime w OffsetDateTimeUTC͔Βͷ࣌ࠩͷΈߟྀ w ZonedDateTimeλΠϜκʔϯΛߟྀ ˞λΠϜκʔϯ㱠UTC͔Βͷ࣌ࠩ λΠϜκʔϯ͸ҎԼ΋ߟྀ͍ͯ͠Δ w Ն࣌ؒ ถࠃ΍੢ԤͰଟ͘ಋೖ w ࣌ࠩͷվగ ͘͝كʹൃੜ

Slide 29

Slide 29 text

Chronology : ྐྵ ΠϯλϑΣʔε Chronology ྐྵͦͷ΋ͷΛද͠ɺ֤छม׵ ϝιουΛఏڙ ChronoLocalDate ྐྵͷ৘ใΛؚΉLocalDate ChronoLocalDateTime
 ChronoLocalDateʹ
 ࣌ࠁΛ෇Ճ ChronoZonedDateTime
 ChronoLocalDateʹ
 ࣌ࠁͱλΠϜκʔϯΛ෇Ճ Era ྐྵͷلݩ ։࢝೥ Λද͢ ˞࿨ྐྵ͸։࢝ɾऴྃ೥݄೔

Slide 30

Slide 30 text

Chronologyͷ࣮૷Ϋϥε IsoChronology/-Era LocalDate ISO 8601 ඪ४ JapaneseChronology/-Era JapaneseDate ࿨ྐྵ ೔ຊ ThaiBuddistChronology/-Era ThaiBuddistDate ෹ྐྵ λΠ MinguoChronology/-Era MinguoDate ຽࠃلݩ ୆࿷ HijirahChronology/-Era HijirahDate ΠεϥϜྐྵ

Slide 31

Slide 31 text

೔෇ɾ࣌ࠁԋࢉ w DateTimeɺPeriodɺInstantɺDuration͸ͦΕࣗ਎͕ Ճࢉɾݮࢉɾൺֱɾ൑ఆɾม׵ϝιουΛ࣋ͭ w OpenJDK߹ྲྀҎલͱൺֱͯ͠ػೳ͸େ෯ʹ࡟ݮ͞ Εͨ΋ͷͷɺґવͱͯ͠Date/CalendarΑΓڧྗ w ࡢ೥ಉ࣌ظͱൺֱͯ͠ɺChronologyͷ࢖͍উख͸޲ ্ͨ͠໛༷ ΠϯλϑΣʔεͷdefaultϝιουཚ༻ͱ͍͏ѱ͖͠લྫΛ࡞͕ͬͨʜ w ImmutableͷͨΊɺԋࢉ݁Ռ͕΋ͱͷΦϒδΣΫτ ʹӨڹ͠ͳ͍ͷ΋େ͖ͳϝϦοτ

Slide 32

Slide 32 text

೔෇ɾ࣌ࠁͷߏ੒ཁૉ Year ʮ೥ʯΛද͢Ϋϥε ˞Ճݮࢉɾ൑ఆɾ֤छม׵ϝιου Month ʮ݄ʯΛද͢ྻڍܕɺ݄຤೔෇΋อ࣋ ˞Ճݮࢉɾ֤छม׵ϝιου YearMonth ʮ೥݄ʯΛද͢Ϋϥε ˞Ճݮࢉɾ൑ఆɾ֤छ൑ఆϝιου MonthDay ʮ݄೔ʯΛද͢Ϋϥε ˞ʮ೥ʯΛՃ͑Ε͹-PDBM%BUF΁ DayOfWeek ʮ༵೔ʯΛද͢ྻڍܕ ˞%BUF5JNF͔Βͷ༵೔औಘ΋Մ

Slide 33

Slide 33 text

JSR 310ͷϑΥʔϚοτػೳ w LocalDate౳ͷtoStringϝιου͸ɺISO 8601ܗࣜ ͰϑΥʔϚοτͨ͠΋ͷΛฦ͢ w ඪ४Ҏ֎ͷϑΥʔϚοτˠDateTimeFormatter
 ˞DateTimeFormatterʹ͸࢖༻ස౓ͷߴ͍ϑΥʔϚοτ͕ఆٛࡁΈ w ϑΥʔϚοτΛ৽͘͠࡞੒͢Δ৔߹͸ɺ DateTimeFomatterBuilderͷ࢖༻Λਪ঑
 ˞ࠃ಺Ͱ͸yyyy/MM/ddܗ͕ࣜීٴ͍ͯ͠ΔͨΊɺԤถͱൺֱͯ͠ DateTimeFormatterBuilderͷ࢖༻ස౓͸ߴ͍ͱࢥΘΕΔ w java.text.DateFormat͸JSR 310Ͱ͸࢖༻Ͱ͖ͳ͍
 ˞ٯʹDateTimeFormatter͸java.text.DateFormatʹม׵Մೳ

Slide 34

Slide 34 text

Interoperability

Slide 35

Slide 35 text

JSR 310㱻Date/Calendarม׵ ॏཁ : JSR 310͸Date/Calendarͱͷ௚઀ม׵Λ αϙʔτ͠ͳ͍ • Date͸InstantΛհͯ͠JSR 310ͱ૬ޓม׵͕Մೳ
 ۩ମతʹ͸Date.from() / Date.toInstant()Λ༻͍Δ • Calendar͸Calendar.toInstant()ͰInstantʹม׵Մೳɺ ͨͩͦ͠ͷٯ͸Ͱ͖ͳ͍ • Instant.toEpochMilli() / Instant.ofEpochMilli() Ͱ InstantΛlong஋ʹม׵͢Δํ๏΋͋Γ

Slide 36

Slide 36 text

ThreeTen backport w JSR 310͔ΒJDK8ґଘͷ෦෼ΛऔΓআ͖ɺJDK7Ͱ ར༻Մೳʹͨ͠ɺJSR 310ϥΠΫͳϥΠϒϥϦ
 ύοέʔδ໊͸java.timeͰ͸ͳ͘org.threeten.bp w Java SE 8ϦϦʔεલʹJSR 310Λ༧श͢ΔͨΊͷ ڭࡐͱͯ͠࠷ద w Apache License 2.0ͷOSSͱͯ͠഑෍
 https://github.com/ThreeTen/threetenbp

Slide 37

Slide 37 text

Examples

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

// 2013೥11݄9೔ˠdate LocalDate date = 
 LocalDate.of(2013, 11, 9);

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

// ࠓ೔ͷ೔෇ˠdate // ࠓ೔ͷ࣌෼ˠdateTime LocalDate date = LocalDate.now(); LocalDateTime dateTime = 
 date.atTime(13, 40);

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

// date: 1992೥10݄8೔ ͏Δ͏೥ // ˠ leap = true LocalDate date = LocalDate.of(1992, 10, 8); boolean leap = date.isLeapYear();

Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

// ࠓ೔ͷ೔෇ ࿨ྐྵ ˠjdate // ThreeTen BackportͰ΋݁Ռࣗମ͸ಉ͡ JapaneseDate jdate =
 JapaneseDate.now(); System.out.println(jdate.toString); H25-11-09 ग़ྗ݁Ռ

Slide 46

Slide 46 text

Ԡ༻ : JSR 310ΛJAXBʹରԠͤͯ͞ΈΔ public class LocalDateXmlAdapter extends! XmlAdapter {! ! @Override! public LocalDate unmarshal(XMLGregorianCalendar value) throws Exception {! int timezone = value.getTimezone();! ZoneOffset offset = ZoneOffset.ofTotalSeconds(timezone * 60);! return OffsetDateTime.of(value.getYear(), value.getMonth(),! value.getDay(), 0, 0, 0, 0, offset).toLocalDate();! }! ! @Override! public XMLGregorianCalendar marshal(LocalDate value) throws Exception {! ZoneOffset offset = OffsetDateTime.now().getOffset();! int timezone = offset.getTotalSeconds() / 60;! return DatatypeFactory.newInstance().newXMLGregorianCalendarDate(! value.getYear(), value.getMonthValue(), value.getDayOfMonth(),! timezone);! }! ! }

Slide 47

Slide 47 text

Conclusion

Slide 48

Slide 48 text

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

Slide 49

Slide 49 text

Date/Calendarͷࠓޙ͸ • JSR 310͕ਁಁ͢Δ·Ͱɺ౰෼ͷؒ͸ͦ ͷҐஔ͚ͮʹมԽ͸ͳ͍͸ͣɻ • Calendar.Builder͸Ԇ໋ાஔ͕ͩɺ୹ظ తʹ͸ޮՌେɻ • ೔෇ͷૢ࡞Ͱ͸JSR 310ʹԕ͘ٴ͹ͳ ͍ͨΊɺ௕ظతʹ͸ϑΣʔυΞ΢τ

Slide 50

Slide 50 text

JDK8࣌୅ͷ೔෇ɾ࣌ࠁදݱ w ͓޷͖ͳAPIΛͲ͏ͧɻ w Date/CalendarͱJSR 310ͷ૬ޓม׵ʹ͍ͭ ͯ͸ૣ͍͏ͪʹ४උ͢Δͷ͕ϕλʔɻ w ౰ॳ͔ΒJSR 310ͷ࢖͑ΔՕॴ͸ɺۀ຿ϩ δοΫͷ೔෇ॲཧɺJAXB͓ΑͼͦΕʹґଘ ͢ΔJAX-RS/JAX-WSɻ

Slide 51

Slide 51 text

Introduction to Date and Time API II HASUNUMA Kenji khasunuma@java.net Twitter: @khasunuma