Это просто часть ужасающего беспорядка, который является API дат / времени Java. Перечислить, что с ним не так, займет очень много времени (и я уверен, что не знаю половины проблем). Разумеется, работа с датами и временем сложна, но все равно.
Сделайте себе одолжение и используйте Joda Time вместо, или, возможно, JSR-310 .
EDIT: Что касается причин, почему, как отмечено в других ответах, это может быть связано с старыми API-интерфейсами C или просто с общим чувством начала всего от 0 ... за исключением того, что дни начинаются с 1 , конечно. Я сомневаюсь, что кто-то, кто не был в оригинальной команде по внедрению, действительно мог объяснить причины, - но опять же я настоятельно призывал читателей не беспокоиться о том, почему были приняты плохие решения, чтобы посмотреть на всю гамму гадости в java.util.Calendar
и найти что-то лучшее.
Одна точка, которая является в пользу использования индексов на основе 0, состоит в том, что она облегчает такие вещи, как «массивы имен»:
// I "know" there are 12 months
String[] monthNames = new String[12]; // and populate...
String name = monthNames[calendar.get(Calendar.MONTH)];
Конечно, это не удается, как только вы получите календарь с 13 месяцами ... но, по крайней мере, указанный размер - это количество ожидаемых месяцев.
Это isn ' t a хорошая причина, но это причина ...
EDIT: В качестве комментариев типа запросов есть некоторые идеи о том, что я считаю неправильным Дата / Календарь:
Date
и Calendar
как разные вещи, но отсутствует разделение «локальных» и «зональных» значений, а также дата / время и дата против времени Date.toString()
, которая всегда использует локальный часовой пояс системы (это путают многие Stack Переполнение пользователей до сих пор)