Upgrade to Pro — share decks privately, control downloads, hide ads and more …

JS Temporalを学ぶ人のための JSR-310入門 / jsr310-for-temp...

JS Temporalを学ぶ人のための JSR-310入門 / jsr310-for-temporal

Avatar for Yukiya Nakagawa

Yukiya Nakagawa

September 26, 2025
Tweet

More Decks by Yukiya Nakagawa

Other Decks in Technology

Transcript

  1. JS Dateの不思議な仕様 // 月が0 から始まる... ? new Date(2024, 0, 1);

    // 2024 年1 月1 日 // なぜこんな設計に... ? 3
  2. 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
  3. 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
  4. 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
  5. JSR-310の設計原則 1. イミュータブル - 全ての型が不変 2. 明確な責任分離 - 用途別の型設計 3.

    Null安全 - ほぼ全てでNULLを拒否 4. ナノ秒精度 - ミリ秒を超える精度 10
  6. JavaScript側の状況 JavaScriptでも長年、様々なライブラリが登場 moment.js (2011年〜) date-fns (2014年〜) dayjs (2018年〜) luxon (2017年〜)

    どれも一定の支持を得たが、決定的な解決策にはならなかった 根本的な解決にはネイティブAPIの刷新が必要だった 12
  7. 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
  8. 型設計の類似性 JavaScript Temporal Java JSR-310 用途 PlainDate LocalDate 日付のみ PlainTime

    LocalTime 時刻のみ PlainDateTime LocalDateTime 日時(TZ無し) ZonedDateTime ZonedDateTime TZ付き日時 Instant Instant UTCベースの単一時点 似た概念、似た名前 14
  9. 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
  10. イミュータブル設計 // 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
  11. 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