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
70
Life of our small product
khasunuma
0
49
How to adapt MicroProfile API for generic Web applications
khasunuma
0
49
Overviewing Admin Console
khasunuma
0
47
Introduction to MicroProfile Metrics
khasunuma
0
75
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
91
JLS myths ~ if-then-else statement ~
khasunuma
0
70
Other Decks in Programming
See All in Programming
Laravel Boostに学ぶ、AIにPHPを書かせる技術 〜OSSの実装から蒸留するエージェント制御の王道〜
kentaroutakeda
3
670
torikago - Ruby::Boxで照らすモジュラモノリスの実行境界
se4weed
1
350
Android CLI
fornewid
0
210
生成AI導入の「期待外れ」を乗り越える ー 開発フロー改革が目指す、真の組織変革
starfish719
0
4k
わからない話を追いかけたら、プログラミング言語を作る側にいた
ydah
3
480
Laravelで学ぶ Webアプリケーションチューニング入門/web_application_tuning_101
hanhan1978
4
1.7k
freee が目指す データ マネジメント戦略 AI-Ready 時代を支える 攻めのガバナンスとは
freee
PRO
0
300
Lean は証明の正しさを確認するためだけのツールって思ってませんか?
inoueasei
1
150
Apache Hive: Toward a Cloud Native Lakehouse
okumin
0
180
改善しないと、タスクが回らない。 “てんこ盛りポジション” を引き継いだ情シスの、入社3ヶ月の業務改善録
krm963
0
260
ルールを書いて終わらせないハーネスエンジニアリング
yug1224
4
1.9k
PHP に部分適用が来るぞ!……ところで何それ?おいしいの? #phpcon / phpcon-2026
shogogg
0
600
Featured
See All Featured
Leo the Paperboy
mayatellez
8
2.1k
Game over? The fight for quality and originality in the time of robots
wayneb77
1
240
Automating Front-end Workflow
addyosmani
1370
210k
Faster Mobile Websites
deanohume
310
32k
The #1 spot is gone: here's how to win anyway
tamaranovitovic
3
1.1k
HDC tutorial
michielstock
2
790
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.5k
Optimising Largest Contentful Paint
csswizardry
37
3.9k
The Language of Interfaces
destraynor
162
27k
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
640
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
730
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