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