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
HASUNUMA Kenji
November 09, 2013
Programming
38
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
73
Life of our small product
khasunuma
0
51
How to adapt MicroProfile API for generic Web applications
khasunuma
0
50
Overviewing Admin Console
khasunuma
0
49
Introduction to MicroProfile Metrics
khasunuma
0
78
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
91
JLS myths ~ if-then-else statement ~
khasunuma
0
71
Other Decks in Programming
See All in Programming
LoopHub - ローカルで動く GitHub で、AI と共同開発
jugyo
1
540
cdk deploy JawsSonic #MARATHONしながらAWSリソースをデプロイしてみよう
akihisaikeda
2
120
ゲームコントローラやキーボードのファームウェアをSwiftで書く
kishikawakatsumi
1
230
AI に Inclusive UI を書かせよう — Design Rules Skill で Compose UI を作り直す
theoriatec2024
1
490
GKE で Pod の見方を変えたら、スケールアウト時の挙動を真に捉えられた話
stkk
0
110
Can LLMs Replicate 4 Years of Compose Migration? Exploring the boundaries of automation with 279 XML files from a real product
makun
0
140
20260828_品質と開発生産性を両立させる、AI時代のE2Eテストの考え方
magicpod
0
200
From 6 People Classroom Meetup to 100 People Regional Conference / FOSS4G Hiroshima 2026
furukawayasuto
0
190
Heart of Swift Concurrency
koher
0
530
Kiroで創り、AgentCoreで繋ぐ!AWSで実践する「AI-DLC」から「AIエージェント統合」までの最新地図
licux
4
670
標準パッケージに uuid が追加された 背景から見る Go らしい意思決定 / go_127_uuid_decision
convto
5
6.7k
【DroidKaigi 2026】「アクセシビリティを利用するとき、 アクセシビリティもまたこちらを利用している」 〜マルウェアによる攻撃と防衛について〜
halunoyo
0
460
Featured
See All Featured
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
19k
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
520
Optimising Largest Contentful Paint
csswizardry
37
4k
[SF Ruby Conf 2025] Rails X
palkan
2
1.4k
Building AI with AI
inesmontani
PRO
1
1.2k
The Cult of Friendly URLs
andyhume
79
7k
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
790
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
23k
ラッコキーワード サービス紹介資料
rakko
1
4.9M
Reality Check: Gamification 10 Years Later
codingconduct
0
2.3k
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
490
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
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