Почему java.time (Java 8) предпочитают старым Date/Calendar?
java.time (Java 8) неизменяем, потокобезопасен и с явной моделью: Instant, LocalDate, LocalTime, ZonedDateTime, Duration, Period. Date и Calendar изменяемы, месяцы с нуля, SimpleDateFormat не потокобезопасен, Date смешивает момент и представление.
- Новый код — только java.time
- Старые API — конвертировать на границе: date.toInstant(), Date.from(instant)
- JDBC 4.2, JPA 2.2, Jackson поддерживают java.time
А ещё Основан на Joda-Time (JSR-310)
Подробно
Старые Date/Calendar изменяемы и не потокобезопасны: у Calendar месяцы с нуля, SimpleDateFormat нельзя шарить между потоками, большая часть Date устарела. java.time (JSR-310) разделяет момент, дату, время и зону, все типы неизменяемы и потокобезопасны, API текучий и предсказуемый — это стандарт для нового кода.
Что хотят услышать
- Проблемы старого API.
- Преимущества java.time.
Частые ошибки
- Использовать SimpleDateFormat как общий static (он не потокобезопасен).
- Забывать, что в Calendar январь = 0.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✓java.time неизменяем и потокобезопасен; Date/Calendar изменяемы и полны ловушек
- ✗java.time — это обёртка над Calendar с теми же проблемами, но с удобными именами методов
- ✗java.time быстрее, но так же изменяем, как Date
- ✗Date удалён из JDK, альтернатив нет
Что спросят дальше
- Какие основные типы есть в java.time?
- Как навести мост со старым Date?
Разбор темы
- Дата и время: java.time
Почему java.time вытеснил Date/Calendar, машинное (Instant) и человеческое (LocalDateTime) время, часовые пояса, Duration/Period и потокобезопасный DateTimeFormatter.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.