Java カレンダーで 1 月が 0 月なのはなぜですか? 質問する

Java カレンダーで 1 月が 0 月なのはなぜですか? 質問する

ではjava.util.Calendar、1 月は 1 月ではなく 0 月と定義されています。それには何か特別な理由があるのでしょうか ?

そのことについて混乱している人をたくさん見てきました...

ベストアンサー1

これは、Java の日付/時刻 API というひどい混乱のほんの一部です。何が問題なのかを列挙すると、非常に長い時間がかかります (そして、問題の半分もわかっていないと思います)。日付と時刻を扱うのは確かに難しいですが、とにかく、ああ、そうです。

ぜひ使ってみてくださいジョダタイム代わりに、あるいはおそらくJSR-310

編集: 理由については、他の回答で述べられているように、古い C API が原因の可能性があります。または、すべてを 0 から開始するという一般的な感覚が原因の可能性もあります...ただし、もちろん、日数は 1 から始まります。元の実装チーム以外の誰かが本当に理由を述べられるかどうかは疑問ですが、繰り返しになりますが、読者の皆さんには、なぜ悪い決定が下されたのかについてあまり心配せず、すべての悪質な点を見てjava.util.Calendar、より良いものを見つけるよう強く勧めます。

0 ベースのインデックスを使用する利点の 1 つは、「名前の配列」のようなものが簡単になることです

// I "know" there are 12 months
String[] monthNames = new String[12]; // and populate...
String name = monthNames[calendar.get(Calendar.MONTH)];

もちろん、13 か月のカレンダーを取得するとすぐにこれは失敗します...ただし、少なくとも指定されたサイズは予想される月数です。

これは良い理由ではありませんが、理由にはなります...

編集: コメントとして、日付/カレンダーのどこが間違っていると思うかについて、いくつかのアイデアをお願いします。

  • 驚くべき基数 (Date の年基数は 1900 ですが、これは非推奨のコンストラクタ用です。また、両方とも月基数は 0 です)
  • 可変性 - 不変型を使用すると、実際には値であるものを扱うのがはるかに簡単になります。
  • 不十分な型セット: 異なるものとして存在するのは良いことですDateCalendar、「ローカル」と「ゾーン」の値の区別が欠けており、日付/時刻と日付と時刻の区別も欠けています。
  • 明確に名前が付けられたメソッドではなく、魔法の定数を使った醜いコードにつながるAPI
  • 理解するのが非常に難しい API - いつ再計算されるかなど、すべての処理
  • パラメータなしのコンストラクタを使用して「現在」をデフォルトにすると、テストが困難なコードになります。
  • 常にシステムのローカルタイムゾーンを使用する実装Date.toString()(これまで多くの Stack Overflow ユーザーを混乱させてきました)

おすすめ記事