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
37
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
67
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
47
Introduction to MicroProfile Metrics
khasunuma
0
74
Basic method for Java EE Web Profile
khasunuma
0
48
Introduction to JCA and MDB
khasunuma
0
100
Collections Framework Begineers Guide 2
khasunuma
0
88
JLS myths ~ if-then-else statement ~
khasunuma
0
70
Other Decks in Programming
See All in Programming
【やさしく解説 設計編・中級 #6】良いアーキテクチャとは ~ 一本の登り道の、行き先 ~
panda728
PRO
0
170
AI 輔助遺留系統現代化的經驗分享
jame2408
1
1.2k
SREの積み重ねがAI駆動開発のガードレールになった ― 7つの実践/SRE Guardrails The 7
tomoyakitaura
8
4.4k
ローカルLLMでどこまでコードが書けるか -拡張版 / How much code can be written on a local LLM Extended
kishida
12
4.8k
Even G2とAWSで推しのエージェントを召喚しよう!
har1101
1
170
LLMによるContent Moderationの本番運用の裏側と品質担保への挑戦
suikabar
3
860
壊れたパーサから始める関数型設計と構成的なパーサ #fp_matsuri
raiga0310
2
230
なぜ型を書くのか? TSKaigi2026で改めて考える #tskaigi_smarthr
kajitack
0
370
PHP初心者セッション2026 〜生成AIでは見えない裏側を知る:今だからLAMPを通して仕組みを学ぶ〜
kashioka
0
480
自作OSでスライド発表する
uyuki234
1
3.8k
才能?センス?知らん、 続けたもん勝ちだ。-- 結婚・出産・癌を越えてなお、私がプロダクトを創り続ける理由
16bitidol
2
860
Snowflake Summitでの新機能 CoCo / CoWork / snowflake-summit-2026-overall-what-new-coco
tatsuhiro
1
230
Featured
See All Featured
Rebuilding a faster, lazier Slack
samanthasiow
85
9.6k
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
72
40k
Navigating Team Friction
lara
192
16k
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
340
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
180
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
1
380
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
280
Building a Modern Day E-commerce SEO Strategy
aleyda
45
9.1k
How GitHub (no longer) Works
holman
316
150k
Prompt Engineering for Job Search
mfonobong
0
380
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
190
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.4k
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