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
JS Temporalを学ぶ人のための JSR-310入門 / jsr310-for-temp...
Search
Yukiya Nakagawa
September 26, 2025
Technology
0
30
JS Temporalを学ぶ人のための JSR-310入門 / jsr310-for-temporal
https://niigata-5min-tech.connpass.com/event/368411/
Yukiya Nakagawa
September 26, 2025
Tweet
Share
More Decks by Yukiya Nakagawa
See All by Yukiya Nakagawa
Cloudflare Workers で作る専門性特化型 MCP サーバー / workers-specialist-mcp
nkzn
1
110
経済メディア編集部の実務に小さく刺さるAI / small-ai-with-editorial
nkzn
2
960
Remix × Cloudflare Pages × Sentry 奮闘記 / remix-pages-sentry
nkzn
1
1.9k
Cloudflareスタックで月間1200万UUの経済メディアにアバター画像生成サービスを作る / Cloudflare Developer Platform for AI avatar service
nkzn
7
4k
5分で流し読むCloudflare Developer Platform
nkzn
3
400
次世代Web認証「パスキー」 / mo-zatsudan-passkey
nkzn
32
18k
パスキーについて今日時点の僕が知っていること / What I Know About Passkeys as of Today
nkzn
8
2.9k
青い空の歩き方 / Flying in the bluesky
nkzn
1
340
SPAの歴史とRemix SPAモードという到達点 / the SPA's chronicle reaches to remix
nkzn
48
18k
Other Decks in Technology
See All in Technology
Introduction to Sansan Meishi Maker Development Engineer
sansan33
PRO
0
310
いまからでも遅くない!SSL/TLS証明書超入門(It's not too late to start! SSL/TLS Certificates: The Absolute Beginner's Guide)
norimuraz
0
260
「れきちず」のこれまでとこれから - 誰にでもわかりやすい歴史地図を目指して / FOSS4G 2025 Japan
hjmkth
1
320
Data Hubグループ 紹介資料
sansan33
PRO
0
2.2k
AWS Control Tower に学ぶ! IAM Identity Center 権限設計の第一歩 / IAM Identity Center with Control Tower
y___u
1
200
[Codex Meetup Japan #1] Codex-Powered Mobile Apps Development
korodroid
2
950
プロポーザルのコツ ~ Kaigi on Rails 2025 初参加で3名の登壇を実現 ~
naro143
1
250
これがLambdaレス時代のChatOpsだ!実例で学ぶAmazon Q Developerカスタムアクション活用法
iwamot
PRO
8
1.1k
プレーリーカードを活用しよう❗❗デジタル名刺交換からはじまるイベント会場交流のススメ
tsukaman
0
180
新規事業におけるGORM+SQLx併用アーキテクチャ
hacomono
PRO
0
320
RDS の負荷が高い場合に AWS で取りうる具体策 N 連発/a-series-of-specific-countermeasures-available-on-aws-when-rds-is-under-high-load
emiki
5
3.7k
ソフトウェアエンジニアの生成AI活用と、これから
lycorptech_jp
PRO
0
300
Featured
See All Featured
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.2k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.2k
A designer walks into a library…
pauljervisheath
209
24k
How To Stay Up To Date on Web Technology
chriscoyier
791
250k
Build The Right Thing And Hit Your Dates
maggiecrowley
37
2.9k
We Have a Design System, Now What?
morganepeng
53
7.8k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
37
2.6k
Building Adaptive Systems
keathley
44
2.8k
Typedesign – Prime Four
hannesfritz
42
2.8k
VelocityConf: Rendering Performance Case Studies
addyosmani
332
24k
Agile that works and the tools we love
rasmusluckow
331
21k
The Language of Interfaces
destraynor
162
25k
Transcript
JS Temporalを学ぶ人のための JSR-310入門 Niigata 5min Tech #22 2025.9.26 Yukiya Nakagawa
1
今日話すこと JS Dateの奇妙な仕様の由来 Joda-Timeから java.time への進化 JS TemporalとJSR-310の共通点 同じ課題に対するアプローチは似る 2
JS Dateの不思議な仕様 // 月が0 から始まる... ? new Date(2024, 0, 1);
// 2024 年1 月1 日 // なぜこんな設計に... ? 3
JavaとJavaScriptのDate仕様は少し似ている JavaScript言語の成立からしてJavaライクな構文を求められた逸話があるが、意図して なのか偶然なのか、Dateクラスの仕様もちょっとだけ似ている。 // JavaScript - 月は0 から11 new Date(2024,
0, 1); // 2024 年1 月1 日 // Java - 月も0 から11 new Date(124, 0, 1); // 2024 年1 月1 日 // ※年は1900 年からの経過年数 // 実用上はCalendar クラスを組み合わせることでなんとか使っていた 両言語とも月が0から始まる奇妙な仕様 (まあJanuary, Februaryの国で生まれたら仕方ないんだけどさ) 4
共通の問題点 月が0から始まる (直感的でない) ミュータブル (意図しない変更が起きる) タイムゾーン処理が複雑 国際化対応が不十分 JavaもJavaScriptも同じ課題を抱えていた 5
Javaではどのように解決したのか 6
Joda-Timeの革命 2002年から開発開始、Java 8以前のデファクトスタンダードに // Joda-Time - 直感的なAPI LocalDate date =
new LocalDate(2024, 1, 1); // 月は1 から! LocalDateTime dt = date.toLocalDateTime(new LocalTime(14, 30)); LocalDate tomorrow = date.plusDays(1); // イミュータブル 「Java Dateの問題を全て解決する」ライブラリとして大成功 AndroidでもJava8正式対応前にバックポートライブラリが作られたりした 7
JSR-310 (java.time) の誕生 Joda-Timeの作者 Stephen Colebourneが主導 2014年: Java 8でリリース ただし、Joda-Timeをそのまま採用せず根本的に再設計
"Joda-Timeには設計上の欠陥があった" - Stephen Colebourne 8
JSR-310の革新 // 用途に応じた明確な型分離 LocalDate date = LocalDate.of(2024, 1, 1); LocalTime
time = LocalTime.of(14, 30); LocalDateTime dateTime = LocalDateTime.of(2024, 1, 1, 14, 30); ZonedDateTime zdt = ZonedDateTime.now(ZoneId.of("Asia/Tokyo")); Instant instant = Instant.now(); 全てイミュータブル、スレッドセーフ、直感的 9
JSR-310の設計原則 1. イミュータブル - 全ての型が不変 2. 明確な責任分離 - 用途別の型設計 3.
Null安全 - ほぼ全てでNULLを拒否 4. ナノ秒精度 - ミリ秒を超える精度 10
では、JavaScriptは 11
JavaScript側の状況 JavaScriptでも長年、様々なライブラリが登場 moment.js (2011年〜) date-fns (2014年〜) dayjs (2018年〜) luxon (2017年〜)
どれも一定の支持を得たが、決定的な解決策にはならなかった 根本的な解決にはネイティブAPIの刷新が必要だった 12
Temporal の登場 TC39で提案されている新しいDate/Time API // Temporal - 明確な型分離 const date
= Temporal.PlainDate.from('2024-01-01'); const time = Temporal.PlainTime.from('14:30'); const dateTime = Temporal.PlainDateTime.from('2024-01-01T14:30'); const zoned = Temporal.ZonedDateTime.from('2024-01-01T14:30[Asia/Tokyo]'); const instant = Temporal.Instant.from('2024-01-01T00:00:00Z'); 13
型設計の類似性 JavaScript Temporal Java JSR-310 用途 PlainDate LocalDate 日付のみ PlainTime
LocalTime 時刻のみ PlainDateTime LocalDateTime 日時(TZ無し) ZonedDateTime ZonedDateTime TZ付き日時 Instant Instant UTCベースの単一時点 似た概念、似た名前 14
API設計の共通点 // Temporal const date = Temporal.PlainDate.from('2024-01-01'); const nextWeek =
date.add({ weeks: 1 }); const modified = date.with({ day: 15 }); // JSR-310 LocalDate date = LocalDate.of(2024, 1, 1); LocalDate nextWeek = date.plusWeeks(1); LocalDate modified = date.withDayOfMonth(15); 操作のパターンが類似 15
イミュータブル設計 // Temporal - 全て不変 const original = Temporal.PlainDate.from('2024-01-01'); const
modified = original.add({ days: 1 }); console.log(original.toString()); // 2024-01-01 ( 変更されない) // JSR-310 - 全て不変 LocalDate original = LocalDate.of(2024, 1, 1); LocalDate modified = original.plusDays(1); System.out.println(original); // 2024-01-01 ( 変更されない) 16
なぜ似ているのか? 同じ問題を解決しようとしているから 1. Date/Time操作の本質的な課題は言語を超えて共通 タイムゾーンの複雑さ 日付と時刻の分離の必要性 イミュータブル性の重要性 2. 業界のベストプラクティスが確立 Joda-Time
→ JSR-310の成功事例 同じ設計パターンの採用 17
注意:直接的な影響は不明 TemporalがJSR-310を直接参考にした証拠はない しかし、似た問題には似た解決策が生まれる 両者とも現代的なDate/Time APIのベストプラクティスを体現 18
JavaScriptエンジニアはJSR-310の事例を調べてみるといいかも 10年以上の実績がある成熟した設計 Temporalと驚くほど似ている 既に解決済みの落とし穴を事前に学べる js-jodaを使ったことがある?それはJSR-310の移植版 JSR-310は「未来のTemporalの予習」として最適! 19
まとめ JS DateもJava Dateも1990年代の設計の限界 Joda-Time (2002年〜) が革新をもたらした JSR-310 (2014年) でモダンな設計が確立
Temporal はかなり似た設計思想を採用 良い設計は言語を超えて共通する! 20
ありがとうございました! Temporalの正式リリースが楽しみ! JSR-310の設計思想を理解して備えよう Temporal Proposal: https://github.com/tc39/proposal-temporal 現在Stage 3(実装推奨段階) 21
参考文献URL一覧 22
JavaScript の歴史とDate API https://cybercultural.com/p/1995-the-birth-of-javascript/ https://en.wikipedia.org/wiki/JavaScript https://www.coursereport.com/blog/history-of-javascript https://auth0.com/blog/a-brief-history-of-javascript/ https://developer.mozilla.org/en- US/docs/Web/JavaScript/Reference/Global_Objects/Date https://www.w3schools.com/js/js_date_methods.asp
https://www.geeksforgeeks.org/javascript/history-of-javascript/ https://softteco.com/blog/history-of-javascript ※ 2025年9月26日時点でのWeb検索により収集 23
Java Date API と JSR-310 https://docs.oracle.com/javase/8/docs/api/java/util/Date.html https://www.joda.org/joda-time/ https://www.baeldung.com/joda-time https://stackoverflow.com/questions/24631909/ https://blog.joda.org/2009/11/why-jsr-310-isn-joda-time_4941.html
https://blog.joda.org/2014/11/converting-from-joda-time-to-javatime.html https://www.mscharhag.com/java/java-8-date-time-api https://belief-driven-design.com/essentials-of-java-time-59cff478fdf/ ※ 2025年9月26日時点でのWeb検索により収集 24
JavaScript Temporal https://tc39.es/proposal-temporal/ https://tc39.es/proposal-temporal/docs/ https://github.com/tc39/proposal-temporal https://developer.mozilla.org/en-US/blog/javascript-temporal-is-coming/ https://bryntum.com/blog/javascript-temporal-is-it-finally-here/ ※ 2025年9月26日時点でのWeb検索により収集 25
その他 https://js-joda.github.io/js-joda/ https://stackoverflow.com/questions/1090815/how-to-clone-a-date-object https://stackoverflow.com/questions/9243578/java-util-date-and-getyear ※ 2025年9月26日時点でのWeb検索により収集 26