Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Introduction to Date and Time API 2
Search
HASUNUMA Kenji
November 09, 2013
Programming
35
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Introduction to Date and Time API 2
HASUNUMA Kenji
November 09, 2013
More Decks by HASUNUMA Kenji
See All by HASUNUMA Kenji
Jakarta EE: The First Parts
khasunuma
0
66
Life of our small product
khasunuma
0
49
How to adapt MicroProfile API for generic Web applications
khasunuma
0
47
Overviewing Admin Console
khasunuma
0
46
Introduction to MicroProfile Metrics
khasunuma
0
72
Basic method for Java EE Web Profile
khasunuma
0
47
Introduction to JCA and MDB
khasunuma
0
100
Collections Framework Begineers Guide 2
khasunuma
0
87
JLS myths ~ if-then-else statement ~
khasunuma
0
67
Other Decks in Programming
See All in Programming
Datadog × OpenTelemetry 入門と実践のあいだ
kn_to_maxpno
1
170
JavaDoc 再入門
nagise
1
410
AIを活用したE2Eテスト実装効率化のあゆみ / ebisu-mobile-14-kotetu
kotetuco
0
130
LLMによるContent Moderationの本番運用の裏側と品質担保への挑戦
suikabar
3
740
Honoでのサプライチェーン侵害対策 〜 3つのライブラリに学ぶ
yusukebe
7
1.4k
Performance Engineering for Everyone
elenatanasoiu
0
210
LLM本来の能力を解き放つサンドボックス技術とAI民主化への適用
yukukotani
3
4.5k
代数的データ型って何が嬉しいの? #frontend_phpcon_do
kajitack
8
3.8k
軽量Java基盤の設計 DIコンテナに頼らない、長期保守と1秒起動の実現 JJUG CCC 2026 Spring
macha64
0
570
TAKTでAI駆動開発の品質を設計する
j5ik2o
7
1.5k
Make SRE Operations Easier with Azure SRE Agent
kkamegawa
0
7.8k
Mujeres en SEO Summit 2026 - Greatest Disaster Hits en Web Performance
guaca
0
200
Featured
See All Featured
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
1
260
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
300
Testing 201, or: Great Expectations
jmmastey
46
8.2k
Building Flexible Design Systems
yeseniaperezcruz
330
40k
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
150
Game over? The fight for quality and originality in the time of robots
wayneb77
1
200
Producing Creativity
orderedlist
PRO
348
40k
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
1
1.4k
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.3k
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
850
Building Applications with DynamoDB
mza
96
7.1k
RailsConf 2023
tenderlove
30
1.5k
Transcript
Introduction to Date and Time API II HASUNUMA Kenji
GlassFish Community
[email protected]
Twitter: @khasunuma November 9, 2013 #ccc_r21
Time?
None
None
None
None
None
None
None
Representation of Date/Time
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͕͋Δ
java.util.Dateͷ՝ w ϑΟʔϧυૢ࡞͕໘ w ϑΟʔϧυ+1900͕࣮ࡍͷ w ݄͕͔Β࢝·Δ(1݄ˠ0ʜ12݄ˠ11) w ϑΟʔϧυͷૢ࡞͕ඇਪ(CalendarΛ͏) w
෦ͱ࣌ࠁ෦͕ࠞࡏ͍ͯ͠Δ w ԋࢉ͕ශऑɺϑΥʔϚοτػೳ͍উखʹ w +%,Ҏ߱ɺҰ෦ྫ֎Λআ͖ϝϯςφϯεͳ͠
java.util.Calendarͷ՝ w ϑΟʔϧυૢ࡞͕໘(DateΑΓվળ) w ݄͕͔Β࢝·ΔˠఆͰ͓Λ͢ w ϑΟʔϧυૢ࡞ͷ͍উख͕ΠϚΠν w ԋࢉ͕ශऑʜͦΕͰDateΑΓଟগϚγ w
ɾ࣌ࠁܕͱͯ͠ೝࣝ͞Εͳ͍͜ͱଟ͍ ྫ: DateFormat ˠ Dateͱͷ૬ޓมΛར༻
java.util.Calendarͷվળ +%,ΑΓCalendar.BuilderΛಋೖ ˠϝιουνΣʔϯ ߦ Ͱɾ࣌ࠁΛදͤΔ // 201311݄9Λද͢Calendar (since JDK8) Calendar
calendar = new Calendar.Builder() .setDate(2013, NOVEMBER, 9) .setField(HOUR_OF_DAY, 9) .build();
JSR 310 Date and Time API
JSR 310 : Date and Time API wDateɺCalendarɺDateFormatΛஔ͖ ͑Δ͜ͱ͕త wISO
8601ܗࣜͷɾ࣌ࠁදݱ wImmutable͔ͭεϨουηʔϑͳAPI wઃܭࢥJoda-Timeʹࠅࣅ
java.util.Date JSR 310 ΦϒδΣΫτ Mutable Immutable ਫ਼ ϛϦඵ φϊඵ ϑΟʔϧυૢ࡞
Calendarܦ༝ αϙʔτ λΠϜκʔϯ αϙʔτ αϙʔτ toStringΓ Unixܗࣜ ISO 8601ܗࣜ ͱ࣌ࠁͷ ෆՄ Մೳ ԋࢉ ൺֱͷΈ ༷ʑͳԋࢉ ؔ࿈Ϋϥε ݸ ͨ͘͞Μ
JSR 310ͷϝϦοτ w݄1ʙ12 Date, Calendar0ʙ11 wtoStringͰISO 8601ܗࣜΛฦ͢ wͱ࣌ࠁΛ͢Δ͜ͱ͕Ͱ͖Δ wଟ༷ͳԋࢉػೳΛ࣋ͭ
wεϨουηʔϑͰ͋Δ
JSR 310ͷσϝϦοτ wJDK8 APIͷதͰ࠷େن(=ෳࡶ) wطଘAPIͱͷ૬ޓӡ༻ੑΨϯແࢹ w Dateͱͷ૬ޓมൺֱత࠷ۙʹ࣮ݱ wࠓޙͷల։͕ෆ໌ྎ w JPAJAXBͷల։ݕ౼த
w গͳ͘ͱJavaFX 8ʹؒʹ߹Θͣ
ࢀߟ: 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
JSR 310 Essentials
Ϛγϯ͚ͷදݱ ෦දݱ • Instant • Duration • Clock ਓ͚ؒͷදݱ
֎෦දݱ • DateTime • Period • Chronology
Ϛγϯ͚ͷදݱ(෦දݱ)
ਓ͚ؒͷදݱ(֎෦දݱ)
DateTime : ɾ࣌ࠁ • TemporalAccessorͷ࣮ • ݱࡏ࣌·ͨҙͷ͔࣌Βੜ • DateTimeͷԋࢉ(plus/minus)͓Αͼଞ ͷDateTime͔ΒͷมΛαϙʔτ
• InstantʹରԠ͢Δਓ͚ؒදݱ
ओͳDateTimeͷ࣮ • LocalDate, LocalTime, LocalDateTime • OffsetTime, OffsetDateTime • ZonedDateTime
• ෆใͷՃ·ͨ༨ใͷΓ ࣺͯʹΑΓ૬ޓʹมՄ
%BUF 5JNF %BUF5JNF -PDBM ݄ ! ࣌ࠩใͳ͠ ! ࣌ඵະຬ ࣌ࠩใͳ͠
݄ ࣌ඵະຬ ࣌ࠩใͳ͠ 0⒎TFU /" ! ࣌ඵະຬ 65$͔Βͷ࣌ࠩ ݄ ࣌ඵະຬ 65$͔Βͷ࣌ࠩ ;POFE /" /" ݄ ࣌ඵະຬ λΠϜκʔϯ
OffsetDateTime vs. ZonedDateTime w OffsetDateTimeUTC͔Βͷ࣌ࠩͷΈߟྀ w ZonedDateTimeλΠϜκʔϯΛߟྀ ˞λΠϜκʔϯ㱠UTC͔Βͷ࣌ࠩ λΠϜκʔϯҎԼߟྀ͍ͯ͠Δ w
Ն࣌ؒ ถࠃԤͰଟ͘ಋೖ w ࣌ࠩͷվగ ͘͝كʹൃੜ
Chronology : ྐྵ ΠϯλϑΣʔε Chronology ྐྵͦͷͷΛද͠ɺ֤छม ϝιουΛఏڙ ChronoLocalDate ྐྵͷใΛؚΉLocalDate ChronoLocalDateTime
<D extends ChronoLocalDate> ChronoLocalDateʹ ࣌ࠁΛՃ ChronoZonedDateTime <D extends ChronoLocalDate> ChronoLocalDateʹ ࣌ࠁͱλΠϜκʔϯΛՃ Era ྐྵͷلݩ ։࢝ Λද͢ ˞ྐྵ։࢝ɾऴ݄ྃ
Chronologyͷ࣮Ϋϥε IsoChronology/-Era LocalDate ISO 8601 ඪ४ JapaneseChronology/-Era JapaneseDate ྐྵ ຊ
ThaiBuddistChronology/-Era ThaiBuddistDate ྐྵ λΠ MinguoChronology/-Era MinguoDate ຽࠃلݩ HijirahChronology/-Era HijirahDate ΠεϥϜྐྵ
ɾ࣌ࠁԋࢉ w DateTimeɺPeriodɺInstantɺDurationͦΕ͕ࣗ ՃࢉɾݮࢉɾൺֱɾఆɾมϝιουΛ࣋ͭ w OpenJDK߹ྲྀҎલͱൺֱͯ͠ػೳେ෯ʹݮ͞ Εͨͷͷɺґવͱͯ͠Date/CalendarΑΓڧྗ w ࡢಉ࣌ظͱൺֱͯ͠ɺChronologyͷ͍উख ্༷ͨ͠
ΠϯλϑΣʔεͷdefaultϝιουཚ༻ͱ͍͏ѱ͖͠લྫΛ࡞͕ͬͨʜ w ImmutableͷͨΊɺԋࢉ݁Ռ͕ͱͷΦϒδΣΫτ ʹӨڹ͠ͳ͍ͷେ͖ͳϝϦοτ
ɾ࣌ࠁͷߏཁૉ Year ʮʯΛද͢Ϋϥε ˞Ճݮࢉɾఆɾ֤छมϝιου Month ʮ݄ʯΛද͢ྻڍܕɺ݄อ࣋ ˞Ճݮࢉɾ֤छมϝιου YearMonth ʮ݄ʯΛද͢Ϋϥε ˞Ճݮࢉɾఆɾ֤छఆϝιου
MonthDay ʮ݄ʯΛද͢Ϋϥε ˞ʮʯΛՃ͑Ε-PDBM%BUF DayOfWeek ʮ༵ʯΛද͢ྻڍܕ ˞%BUF5JNF͔Βͷ༵औಘՄ
JSR 310ͷϑΥʔϚοτػೳ w LocalDateͷtoStringϝιουɺISO 8601ܗࣜ ͰϑΥʔϚοτͨ͠ͷΛฦ͢ w ඪ४Ҏ֎ͷϑΥʔϚοτˠDateTimeFormatter ˞DateTimeFormatterʹ༻සͷߴ͍ϑΥʔϚοτ͕ఆٛࡁΈ w
ϑΥʔϚοτΛ৽͘͠࡞͢Δ߹ɺ DateTimeFomatterBuilderͷ༻Λਪ ˞ࠃͰyyyy/MM/ddܗ͕ࣜීٴ͍ͯ͠ΔͨΊɺԤถͱൺֱͯ͠ DateTimeFormatterBuilderͷ༻සߴ͍ͱࢥΘΕΔ w java.text.DateFormatJSR 310Ͱ༻Ͱ͖ͳ͍ ˞ٯʹDateTimeFormatterjava.text.DateFormatʹมՄೳ
Interoperability
JSR 310㱻Date/Calendarม ॏཁ : JSR 310Date/CalendarͱͷมΛ αϙʔτ͠ͳ͍ • DateInstantΛհͯ͠JSR 310ͱ૬ޓม͕Մೳ
۩ମతʹDate.from() / Date.toInstant()Λ༻͍Δ • CalendarCalendar.toInstant()ͰInstantʹมՄೳɺ ͨͩͦ͠ͷٯͰ͖ͳ͍ • Instant.toEpochMilli() / Instant.ofEpochMilli() Ͱ InstantΛlongʹม͢Δํ๏͋Γ
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
Examples
// ࠓͷΛऔಘˠdate LocalDate date = LocalDate.now();
// 201311݄9ˠdate LocalDate date = LocalDate.of(2013, 11, 9);
// ࠓͷˠd1 // ޙͷˠd2 LocalDate d1 = LocalDate.now(); LocalDate d2
= d1.plusDays(3);
// ࠓͷˠdate // ࠓͷ࣌ˠdateTime LocalDate date = LocalDate.now(); LocalDateTime dateTime
= date.atTime(13, 40);
// ࠓͷ࣌ˠdateTime // ࠓͷˠdate LocalDateTime dateTime = LocalDateTime.now(); LocalDate
date = LocalDate.from(dateTime);
// date: 199210݄8 ͏Δ͏ // ˠ leap = true
LocalDate date = LocalDate.of(1992, 10, 8); boolean leap = date.isLeapYear();
// ࠓͷˠdate // EBUFΛඪ४ग़ྗ LocalDate date = LocalDate.now(); System.out.println(date.toString()); 2013-11-09
ग़ྗ݁Ռ
// ࠓͷ ྐྵ ˠjdate // ThreeTen BackportͰ݁Ռࣗମಉ͡ JapaneseDate jdate =
JapaneseDate.now(); System.out.println(jdate.toString); H25-11-09 ग़ྗ݁Ռ
Ԡ༻ : JSR 310ΛJAXBʹରԠͤͯ͞ΈΔ public class LocalDateXmlAdapter extends! XmlAdapter<XMLGregorianCalendar, LocalDate>
{! ! @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);! }! ! }
Conclusion
JSR 310ͱԿͳͷ͔ wJSR 310java.util.DateͷܽΛͯ͢ ղܾ͠Α͏ͱ͢Δ৺తࢼΈ wաڈͱͷޓੑΛஅͪΔ͜ͱͰɺ ɾ࣌ࠁAPIͷཧΛٻͨ͠ wਖ਼Γա͗ײ൱Ίͳ͍͕ɺطଘAPI ͷͷଟ͘Λղܾͨ͠ධՁ
Date/Calendarͷࠓޙ • JSR 310͕ਁಁ͢Δ·Ͱɺͷؒͦ ͷҐஔ͚ͮʹมԽͳ͍ͣɻ • Calendar.BuilderԆ໋ાஔ͕ͩɺظ తʹޮՌେɻ • ͷૢ࡞ͰJSR
310ʹԕ͘ٴͳ ͍ͨΊɺظతʹϑΣʔυΞτ
JDK8࣌ͷɾ࣌ࠁදݱ w ͓͖ͳAPIΛͲ͏ͧɻ w Date/CalendarͱJSR 310ͷ૬ޓมʹ͍ͭ ͯૣ͍͏ͪʹ४උ͢Δͷ͕ϕλʔɻ w ॳ͔ΒJSR 310ͷ͑ΔՕॴɺۀϩ
δοΫͷॲཧɺJAXB͓ΑͼͦΕʹґଘ ͢ΔJAX-RS/JAX-WSɻ
Introduction to Date and Time API II HASUNUMA Kenji
[email protected]
Twitter: @khasunuma