Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Introduction to Date and Time API 2
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
HASUNUMA Kenji
November 09, 2013
Programming
39
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
74
Life of our small product
khasunuma
0
52
How to adapt MicroProfile API for generic Web applications
khasunuma
0
52
Overviewing Admin Console
khasunuma
0
51
Introduction to MicroProfile Metrics
khasunuma
0
81
Basic method for Java EE Web Profile
khasunuma
0
49
Introduction to JCA and MDB
khasunuma
0
110
Collections Framework Begineers Guide 2
khasunuma
0
92
JLS myths ~ if-then-else statement ~
khasunuma
0
75
Other Decks in Programming
See All in Programming
半永久的に提供し続けられるプライベートクラウドを目指して ― 利用者の認知負荷を抑えるAPI抽象化とハードウェア世代交代の基盤設計
tomokon
0
170
マイコン向けの軽量Ruby「PicoRuby」で各種デバイスを制御するネイティブアプリの実現手法
bash0c7
0
460
Heart of Swift Concurrency
koher
0
1k
Verilogで学ぶCPU自作入門.pdf
uyuki234
8
3.7k
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
320
WebRTC映像をAirPlayに対応させる挑戦.pdf
monolithic_adam
0
320
速習iPhone Duo対応
yuukiw00w
2
850
AI時代のコードレビューは人に向けるな、仕組みに向けろ
texmeijin
1
180
パズルゲームの作り方 / how to make puzzle games
kaityo256
PRO
2
240
The Rails Doctrine Decade
koic
2
400
Vue Fes Japan 2026 タイムテーブル徹底解説
448jp
1
560
Omarchy Tokyo やると聞いて UMPC 買ってセットアップしてきた
mtsmfm
0
180
Featured
See All Featured
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
230
23k
[Rails World 2026] Durable orchestration on Rails: from continuation to workflow
palkan
1
360
Mind Mapping
helmedeiros
1
370
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.7k
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
380
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
720
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
340
New Earth Scene 8
popppiees
4
2.6k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
1k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.8k
Chasing Engaging Ingredients in Design
codingconduct
0
340
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