「Date は使用不可、Temporal が有効です。」

2026/01/13 0:20

「Date は使用不可、Temporal が有効です。」

RSS: https://news.ycombinator.com/rss

要約

Japanese Translation:

JavaScript のネイティブ

Date
オブジェクトは、月をゼロインデックスで解釈したり、2 桁の年(例:「49」が 2049 年になる、一方「99」は 1999 年、「100」は 0100 年)と誤認したり、区切り文字(スラッシュ vs ハイフン)によって日付をシフトさせたりするなど、混乱しやすく可変です。タイムスタンプを保持し、セッターで自身を変更するため、再利用された
Date
は隠れた副作用を引き起こします。新しく提案された Temporal API は、これらの問題を解決するために、イミュータブルなクラス(
PlainDate
PlainDateTime
ZonedDateTime
)を提供します。
.add()
.subtract()
のような操作は元のオブジェクトを変更せず、新しいオブジェクトを返すため、偶発的なミューテーションが排除されます。Temporal は適切なタイムゾーン処理も備え、夏時間規則に対応し、グレゴリオ暦とともに動作するため、
Date
が無視している問題を解決します。ECMAScript の計画機能として、開発者は手動での
Date
操作から Temporal の明確かつイミュータブルな API への移行が推奨されます。これにより Web アプリケーションの信頼性が向上し、不意のミューテーションや誤ったタイムゾーンによるバグが減少し、業界全体で最新の JavaScript 標準が促進されます

本文

時間は私たちをすべて馬鹿にします、そして JavaScript もその点では決して例外ではありません。
正直なところ、後者についてはあまり気にしていません――JavaScript for Everyone を読んだり、ニュースレターを購読したりしているなら、私は実際には JavaScript のちょっとした奇妙さを大好きであることをご存知でしょう。

「縫い目が見える」ことが好きです。ES‑262 仕様はフォーマルで鉄壁に見えても、もし見るべき場所を知っていれば、言語を構築し続けている何百人もの人々が下した良い決定と悪い決定のすべてを見ることができる。JavaScript にはキャラクターがあります。もちろん、期待通りに全てが動くわけではありませんが――そうですね、もし私を聞けば、JavaScript は知れば知るほど本当に魅力的です!ただ、その魅力は言語のある部分ですぐに崩れ去ってしまいます。

// 数値月は 0 インデックスですが、年と日付はそうではありません:
console.log( new Date(2026, 1, 1) );
// 結果: Date Sun Feb 01 2026 00:00:00 GMT-0500 (Eastern Standard Time)

// 「32」〜「49」の数値文字列は 2000 年代とみなされます:
console.log( new Date("49") ); // Fri Jan 01 2049
// 「33」〜「99」の数値文字列は 1900 年代とみなされます:
console.log( new Date("99") ); // Fri Jan 01 1999
// …しかし「100」以上は年ゼロから始まります:
console.log( new Date("100") ); // Fri Jan 01 0100

// 文字列ベースの日付は期待通りに動作します:
console.log( new Date("2026/1/2") );          // Fri Jan 02 2026
console.log( new Date("2026/02/2") );        // Mon Feb 02 2026
console.log( new Date("2026-02-2") );        // Mon Feb 02 2026
console.log( new Date('2026/01/02') );       // Fri Jan 02 2026
// ただし、年・月・日をハイフンで区切る場合は…
console.log( new Date('2026-01-02') );        // Thu Jan 01 2026

Date
は本当に嫌いです。車で学校へ向かう途中に Java の宿題から無理やりコピーされ、同じ誤答がそのまま残されたようなものです。「Date」という名前自体が誤解を招きます――日付ではなく「時刻」を表すのです。内部的には、
Date
は 1,000 ミリ秒単位で分割された Unix タイムスタンプ(数値)として保存されます。Unix 時間は日付を暗示しますが、それでも:Date は時刻を表し、その時点から日付を推測できる――それはひどいです。

// 1995 年 12 月 4 日午前 0:00:00 GMT‑05(JavaScript が発表された日)の Unix タイムスタンプ:
const timestamp = 818053200;
console.log( new Date(timestamp * 1000) ); // Mon Dec 04 1995 00:00:00 GMT-0500

「日付」や「時刻」といった言葉は意味を持ちますが、JavaScript はそのままです。
Java は 1997 年に

Date
を非推奨としました――JavaScript の
Date
が世の中に放たれた数年後。以来、この混乱を抱えてきました。

これらは私が

Date
に対して抱く主な問題ではありません。私の不満は、単なるパースや構文、あるいは「開発者エルゴノミクス」ではなく、魂に関わるものです。
Date
を使うということは、時間そのものの根本的性質から逸脱することを意味します。


JavaScript のプリミティブ値はすべて不変

数値・真偽値・文字列など、すべては値として保存されます。作成後に変更できません。

const theNumber = 3;
console.log(theNumber); // 3

let theOtherNumber = theNumber;
theOtherNumber = 5;
console.log(theOtherNumber); // 5
console.log(theNumber);      // 3

一方、配列・マップ・セットなどのオブジェクト値は可変です。変数はプリミティブかオブジェクトへの参照を保持できます。

const theObject = { theValue: 3 };
theObject.theValue++;          // 4

const theOtherObj = theObject;
theOtherObj.theValue++;        // 5
console.log(theObject.theValue); // 5

これが

Date
に関係します。
Date
はオブジェクトを生成するコンストラクタで、不可避的に可変データ構造です。

const theDate = new Date();
console.log(typeof theDate); // "object"

theDate.setMonth(10);
console.log(theDate.toDateString()); // Sun Nov 30 2025

したがって

Date
インスタンスを保持している変数は、変更可能なオブジェクトへの参照です。次の例を見てください。

const today = new Date();
const addDay = theDate => {
    theDate.setDate( theDate.getDate() + 1 );
    return theDate;
};

console.log(`Today is ${today.toLocaleDateString()}, tomorrow is ${addDay(today).toLocaleDateString()}.`);

today
addDay
が返す値は同じ可変オブジェクトを指しています。結果として「今日」が「明日」になってしまいます。この副作用は微妙ですが危険です。


Temporal:
Date
の代替

Temporal はコンストラクタではなく、名前空間オブジェクトです。

const today = new Temporal(); // ❌ TypeError: Temporal is not a constructor

代わりに

Temporal
は組み込みの
Math
オブジェクトのように振る舞います――静的プロパティとメソッドを持つ単なるオブジェクトです。

console.log(Temporal);
/* Result (expanded):
Temporal { … }
  Duration: function Duration()
  Instant: function Instant()
  Now: Temporal.Now { … }
  PlainDate: function PlainDate()
  …
*/

現在の日付を取得

Temporal.Now.plainDateISO()
YYYY-MM-DD
の形式で日付のみのオブジェクトを返します。

const nowTemporal = Temporal.Now.plainDateISO();
console.log(nowTemporal); // Temporal.PlainDate 2025-12-31

new Date()
と違い、時間成分はありません。

日付の操作

Temporal オブジェクトに対するすべての変更操作は 新しいオブジェクトを返し、元のものは変更されません。

const today = Temporal.Now.plainDateISO();

console.log(today.add({ days: 1 }));               // 2026-01-01
console.log(today.add({ months: 1, days: 1 }).subtract({ years: 2 })); // 2024-01-31

// 元のオブジェクトは変わらない:
console.log(today);                               // 2025-12-31

Temporal
オブジェクト自体は可変(任意のプロパティを追加できます)が、ビルトインメソッドは日付値を変更しません。

「Today is X, tomorrow is Y」を書き直す

Date
ではヘルパー関数内で新しいインスタンスを作成する必要がありました。

const today = new Date();
const addDay = theDate => {
    const tomorrow = new Date();
    tomorrow.setDate(theDate.getDate() + 1);
    return tomorrow;
};

console.log(`Tomorrow will be ${addDay(today).toLocaleDateString()}. Today is ${today.toLocaleDateString()}.`);

Temporal
を使えば、1 行で完結します。

const today = Temporal.Now.plainDateISO();
console.log(`Tomorrow will be ${today.add({ days: 1 })}. Today is ${today}.`);

結論

Temporal
は JavaScript にモダンかつ不変に近い日付処理をもたらします。
Date
の奇妙さを排除し、操作とフォーマットのための明確な API を提供し、偶発的な副作用をなくします。まだドラフト(ステージ 3)ですが、最新ブラウザで既に利用可能です。正式実装が完成する前にぜひ試してみてください。

使ってみる:

const today = Temporal.Now.plainDateISO();
const jsShipped = Temporal.PlainDate.from("1995-12-04");
const sinceDate = today.since(jsShipped, { largestUnit: 'year' });

console.log(`${sinceDate.years} years, ${sinceDate.months} months, and ${sinceDate.days} days.`);

やがて JavaScript は合理的でモダンな日付処理を手に入れます。古い

Date
は棚の奥にしまい、日付を扱う際の第一選択肢ではなくなるでしょう。

同じ日のほかのニュース

一覧に戻る →

2026/01/13 4:27

了解しました!内容は明確で簡潔に保ちます。余分な改行や不必要な記号は入れず、リストがある場合は読みやすいようにきちんとインデントします。他にご要望がございましたら、お気軽にお知らせくださいね!

## Japanese Translation: **改訂された概要** CoworkはClaude Maxをベースにしたリサーチプレビュー・ツールで、現在はmacOSアプリを通じてMaxサブスクライバー向けに利用可能です。ユーザーが自分のコンピュータ上の特定フォルダへのClaudeのアクセス権を付与すると、そのフォルダ内のファイルを読み取り・編集・作成できるようになります。これにより、ダウンロードの整理、スクリーンショットからスプレッドシートを生成すること、散在したメモからレポートをドラフトするなどのタスクが便利に行えます。 標準的なチャットとは異なり、CoworkはAIにより大きな主体性を与えます。AIはタスクを計画し、実行し、進捗状況を提供します。このツールはClaude Codeと基盤を共有しており、非コーディングの文脈でもコード風の対話が可能です。ユーザーは既存のコネクター(例:ドキュメントやプレゼンテーション)をリンクしたり、Chromeとのペアリングでウェブ閲覧を行ったりして機能を拡張できます。AIは複数タスクをキューに入れ、並列実行することで前後のチャットを減らします。 制御権はユーザーに残ります:Claudeが見るフォルダとコネクターを選択し、大きな操作を行う前にプロンプトが表示されます。ただし、誤った指示でファイルが削除されたり、プロンプトインジェクションが発生するリスクもあるため、安全対策は継続的に開発中です。 このプレビューはフィードバックを集めることを目的としており、将来のリリースではデバイス間同期、Windowsサポート、強化された安全機能、および拡張されたコネクターオプションが追加される可能性があります。Coworkは個人向けにファイル整理を効率化し、手動監視を保ちながらファイルベースのワークフローを自動化する制御可能なAIアシスタントとして設計されています。

2026/01/13 1:04

**TimeCapsuleLLM:** 1800年〜1875年のデータのみで訓練された大規模言語モデル (Note: The length is preserved while using natural, polite Japanese.)

## Japanese Translation: ``` ## Summary TimeCapsule LLM プロジェクトは、歴史的な英語データのみを使用して言語モデルをゼロから構築し、現代のバイアス(「Selective Temporal Training」)を排除します。 - **Model evolution** - *v0* (16 M パラメータ、nanoGPT ベース) は約187 MB の1800年代テキストで訓練され、1800年代風の言語を生成しましたが、一貫性のない文になりました。 - *v0.5* (123 M パラメータ、引き続き nanoGPT) はコーパスを約435 MB に拡張し、文法・句読点を改善しましたが、高い幻覚と OCR ノイズに悩まされました。 - *v1* (700 M パラメータ、Phi 1.5 ベース) は約6.25 GB のデータで訓練され、歴史的事件や人物を正確に思い出せるようになりました。 - *v2mini‑eval1* (300 M パラメータ、90 GB London コーパス全体の15 GBサンプル) はわずか10 K ステップで訓練され、トークナイズ問題により「Who is Charles Dickens?」のような文字化けした出力が生成されました。 - *v2mini‑eval2* (v2mini‑eval1 と同じサイズ・データ) はチャールズ・ダーウィンについて極めて不連続なテキストを生成しました。 - **Dataset** 完全版 v2 データセットは1800–1875 年のロンドン テキストで 90 GB を含み、136,344 ドキュメントから構成されています。15 GB のサンプルは Hugging Face(https://huggingface.co/datasets/haykgrigorian/TimeCapsuleLLM-London-1800-1875-v2-15GB)で公開されています。 - **Training setup** *v0/v0.5* は GeForce RTX 4060 GPU、i5‑13400F CPU、および 16 GB RAM を使用しました。 *v1* と *v2mini‑eval1* はレンタル NVIDIA A100 SXM GPU 上で訓練されました。 - **Tokenization & evaluation** 時代固有のスペリングと語彙に対応するカスタムトークナイザー(vocab.json & merges.txt)を構築しました。出力は言語的正確さ、幻覚率、およびトークナイズ品質で評価され、バイアス統計は別途 v2 バイアスレポートに記載されています。 - **Future work** 今後の計画として、完全版 90 GB v2 データセットへの拡張、トークナイザーパイプラインの改良、およびより深いバイアス分析を実施します。 - **Impact** このプロジェクトは、歴史家・教育者・AI‑ethics 開発者が時代に即した言語モデルを必要とする際に有益であり、現代バイアスを減らすための時間的選択訓練(temporal selective training)の具体例として NLP コミュニティにも貢献します。 ```

2026/01/13 5:26

ファブリス・ベルラール氏のTS Zip(2024)

## 日本語訳: **概要** ts_zip は、GPU を活用したテキスト圧縮ツールであり、RWKV 169M v4 大規模言語モデル(パラメータを 8 ビットに量子化し、BF16 で評価)を使用してトークン確率を予測し、その予測に基づいて算術符号化を適用します。従来のツールよりも高い圧縮率を達成しています: - alice29.txt – **1.142 bpb**(21,713 B) - book1 – **1.431 bpb**(137,477 B) - enwik8 – **1.106 bpb**(13,825,741 B) - enwik9 – **1.084 bpb**(135,443,237 B) - linux‑1.2.13.tar – **1.021 bpb**(1,196,859 B)。 RTX 4090 上では、ツールは約 1 MB/s の速度で圧縮し、同程度の速度で解凍します。システムに少なくとも **4 GB の RAM** があることが前提です。ts_zip は実験的なものであり、バージョン間の後方互換性は保証されません。また、その性能評価は GPU/CPU またはスレッド数に依存せず、決定論的に行われます。この手法はプレーンテキストファイルで最も効果を発揮し、バイナリデータではエントロピーの削減がほとんど得られません。主に英語で訓練されていますが、他言語やソースコードにも比較的適切に対応します。 ダウンロードリンク: - Linux tarball: `ts_zip‑2024‑03‑02.tar.gz` - Windows ZIP: `ts_zip‑2024‑03‑02-win64.zip` 将来のリリースでは、圧縮率をさらに向上させ、言語サポートを拡大し、可能ならファイルタイプの取り扱いを追加しつつ、ハードウェア間で評価が再現できるようにすることを目指します。GPU リソースを持つユーザー(データアーカイブ担当者や大量テキストコーパスを管理する開発者など)にとって、速度を犠牲にせず高い圧縮率を実現できる最適なツールです