2 ポイント 投稿者 GN⁺ 2025-01-31 | 1件のコメント | WhatsAppで共有
  • JavaScript Temporal のリリースが開始

    • 新しい JavaScript Temporal オブジェクトの実装が、ブラウザーの実験的リリースに含まれ始めています。これは Web 開発者にとって大きなニュースであり、JavaScript で日付と時刻を扱うことが大幅に簡素化され、モダンになります。
    • スケジュール管理、国際化、時間に敏感なデータに依存するアプリケーションは、組み込み機能を使って効率的かつ正確で一貫した日付、時刻、期間、カレンダーを利用できます。
    • 安定したクロスブラウザー対応まではまだ遠く、実装の発展に伴って変更が入る可能性はありますが、今の Temporal を見て、その理由や解決する問題を理解することはできます。
    • 今週 MDN に追加された 270 ページを超える Temporal ドキュメントがあり、詳しい説明と例が含まれています。
  • JavaScript Temporal とは?

    • Temporal を理解するために、JavaScript の Date オブジェクトを見てみることができます。JavaScript が 1995 年に作られたとき、Date オブジェクトは Java の初期の欠陥ある java.util.Date 実装からコピーされました。
    • Java は 1997 年にこの実装を置き換えましたが、JavaScript はほぼ 30 年にわたって同じ API に縛られています。
    • JavaScript の Date オブジェクトの主な問題は、ユーザーのローカル時刻と UTC しかサポートせず、タイムゾーン対応がないことです。また、パースの挙動が非常に信頼しにくく、Date 自体がミュータブルであるため、追跡しにくいバグを引き起こすことがあります。
    • こうした問題のせいで、JavaScript で日付と時刻を扱うことは複雑でバグを生みやすくなっています。ほとんどの開発者は、アプリケーションで日付と時刻をより適切に処理するために Moment.js や date-fns のようなライブラリに依存しています。
    • Temporal は Date オブジェクトを完全に置き換えるよう設計されており、日付と時刻の管理を信頼でき、予測可能なものにします。Temporal はタイムゾーンやカレンダー表現をサポートし、変換、比較、計算、フォーマットなどのための多くの組み込みメソッドを追加します。
  • 中核となる概念

    • Temporal における中核的な概念は、インスタント(歴史上の一意な時点)、壁時計時間(ローカル時刻)、期間です。API はこれらの概念を扱うために次のような構造を持っています:
      • 期間: Temporal.Duration 2 つの時点の差
      • 時点:
        • 一意な時点:
          • タイムスタンプとして: Temporal.Instant
          • タイムゾーン付きの日時: Temporal.ZonedDateTime
        • タイムゾーンに依存しない日付/時刻 ("Plain"):
          • 完全な日付と時刻: Temporal.PlainDateTime
          • 日付のみ: Temporal.PlainDate
          • 年と月: Temporal.PlainYearMonth
          • 月と日: Temporal.PlainMonthDay
          • 時刻のみ: Temporal.PlainTime
      • 現在: さまざまなクラスのインスタンス、または特定の形式で現在時刻を取得するには Temporal.now を使用
  • Temporal の例

    • Temporal の最も基本的な使い方の一部は、ISO 文字列で現在の日付と時刻を取得することです。多くのメソッドでタイムゾーンを指定できるようになり、複雑な計算を自分で行う必要がなくなります。
    • さまざまなカレンダーを扱うことも簡素化され、グレゴリオ暦以外のカレンダーシステム(例: ヘブライ語、中国語、イスラム)で日付を作成できます。
    • Unix タイムスタンプを扱うことは、多くのシステム(API、データベース)が時刻を表すためにその形式を使っているため、非常によくあるユースケースです。
    • compare() メソッドを使うと、期間をエレガントかつ効率的にソートできます。
  • Temporal の試用とブラウザー対応

    • サポートは実験的なブラウザーリリースに少しずつ含まれ始めており、Firefox が現在もっとも成熟した実装を持っています。
    • Firefox では、Temporal は javascript.options.experimental.temporal 設定の背後にある Nightly バージョンに組み込まれています。
    • 実験的実装が導入されつつある今は、Temporal を試し、JavaScript で日付と時刻を処理するモダンなアプローチに慣れる良い時期です。
  • 謝辞

    • Eric Meyer に、このトピックに関する取り組みに感謝します。Eric が mdn/content のフォークでブラウザー互換性データを文書化し、ドキュメントを構成してから約 4 年が経ちました。
    • Joshua Chen は Eric からバトンを引き継ぎ、MDN ドキュメント向けのプルリクエストを準備しました。
    • André Bargull に、Firefox の Temporal 実装に関する作業への感謝を表します。

1件のコメント

 
GN⁺ 2025-01-31
Hacker Newsの意見
  • Temporalは既存のDate() APIの問題を解決するうえで有用。RustのchronoやJavaのJoda Timeのような高品質な時間ライブラリに着想を得た、使いやすいAPIを提供する

    • 時間は複雑であり、Temporalはこれをナイーブ時間、インスタント、ゾーン付き時間に分けて扱う
    • タイムスタンプに1日を加える際は、それが特定のタイムゾーンにおけるローカル時間かどうかを判断する必要がある。そうしないと、DSTやタイムゾーン変更時にバグが発生しうる
    • 「固定オフセット」のタイムスタンプと、特定のタイムゾーンのタイムスタンプとの間にあるシリアライズの問題も解決する
  • Temporal.ZonedDateTime.prototype.withTimeZone()を使ってタイムゾーンを変換できる

    • タイムゾーン変換と期間の処理はライブラリが担うべき重要な機能であり、Temporalはそれに対応している
    • ただし、Temporal.Durationはユーザー定義のformat関数を提供していない
  • Temporalの提案は良いが、比較時に参照の同一性を使う点は惜しい

    • これにより、オブジェクトをMapのキーとして使ったり、Setに集めたりする機能が失われる
  • TC39では多くの機能が開発中であり、Temporalが早くリリースされてほしい

    • 主要ブラウザが新機能をサポートするには開発努力が必要
  • Temporalのタイムゾーンデータ更新方法が気になる

    • ユーザーがブラウザを更新しなければ、誤った時刻を見る可能性がある
  • タイムゾーン変更時にイベントを追加すべきだという提案

    • 多くの人が毎日タイムゾーンをまたいで移動している
  • Temporalという名前は一般的な時間オブジェクトとの衝突を避けるために使われたが、最初はガベージコレクション制御のことだと誤解するかもしれない

  • PHPのCarbonクラスはDateTimeを継承しており、可変タイムスタンプ操作の問題を説明している

    • CarbonImmutableを使って常に新しいインスタンスを返すようにするのがよい
    • LaravelでCarbonImmutableとCarbonをエイリアスとして取り込む方法が提案されている
  • JavaScript Temporalに関するさまざまな記事や議論がある