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
24
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
98
経済メディア編集部の実務に小さく刺さるAI / small-ai-with-editorial
nkzn
2
950
Remix × Cloudflare Pages × Sentry 奮闘記 / remix-pages-sentry
nkzn
1
1.9k
Cloudflareスタックで月間1200万UUの経済メディアにアバター画像生成サービスを作る / Cloudflare Developer Platform for AI avatar service
nkzn
7
3.9k
5分で流し読むCloudflare Developer Platform
nkzn
3
390
次世代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
330
SPAの歴史とRemix SPAモードという到達点 / the SPA's chronicle reaches to remix
nkzn
48
18k
Other Decks in Technology
See All in Technology
低リスクで小学生男児を鍵っ子にする 俺の勉強会#4
inakaphper
0
200
施策が均質化する採用市場で何を捨て 何を大事にしていくかを考える
akyun
0
220
業務でAIの力を最大限に発揮するために #弁護士ドットコム
bengo4com
0
280
AWSのProductのLifecycleについて
stknohg
PRO
0
240
業務自動化プラットフォーム Google Agentspace に入門してみる #devio2025
maroon1st
0
130
"複雑なデータ処理 × 静的サイト" を両立させる、楽をするRails運用 / A low-effort Rails workflow that combines “Complex Data Processing × Static Sites”
hogelog
2
1.1k
20250924_LT2本やる.pdf
foursue
0
790
Создание мультиагентной системы на базе AI Studio
shwars
0
180
QuasiなCyclicを笑いながらハミング
mitsu1119
0
180
【新卒研修資料】LLM・生成AI研修 / Large Language Model・Generative AI
brainpadpr
11
3.3k
PythonとLLMで挑む、 4コマ漫画の構造化データ化
esuji5
0
110
LLMアプリケーション開発におけるセキュリティリスクと対策 / LLM Application Security
flatt_security
2
480
Featured
See All Featured
Site-Speed That Sticks
csswizardry
10
850
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
53
3k
Optimising Largest Contentful Paint
csswizardry
37
3.4k
Docker and Python
trallard
46
3.6k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
30
9.7k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
140
34k
Done Done
chrislema
185
16k
How to Ace a Technical Interview
jacobian
280
23k
Java REST API Framework Comparison - PWX 2021
mraible
33
8.8k
Bootstrapping a Software Product
garrettdimon
PRO
307
110k
The Illustrated Children's Guide to Kubernetes
chrisshort
48
51k
jQuery: Nuts, Bolts and Bling
dougneiner
64
7.9k
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