Недавно я наткнулся на date4j , чрезвычайно простую библиотеку (по сути, один класс) для работы с датами в Java.Концептуально мне очень нравится «идея» date4j.На самом деле, после прочтения всего основного сайта и документации в javadoc, я в значительной степени согласен со всем изложенным.
Теперь, может быть по нескольким причинам, почему я не должен использоватьdate4j - ошибки, производительность, отсутствие пользователей и т. д. Я не спрашиваю об этом.Я концептуально спрашиваю, что не так с идеей date4j (для большинства приложений там)?Конечно, могут быть некоторые приложения, которым нужно что-то вроде joda или threeten - но я полагаю, что они в меньшинстве.
Обычные советы, которые люди дают пользователям, имеющим дело с датами / временем (почти каждый пишет javaapp) - это что-то вроде:
- Используйте joda-time вместо java.util.Calendar
- Установите для веб-сервера значение UTC
- Установите базу данныхсервер для UTC
- Сохраните дату и время в UTC
Фактически, последние три пункта маркировки иллюстрируют проблемы с текущей ментальной моделью, которая возникает у людей при работе с датами.Люди пытаются управлять часовыми поясами как на уровне приложения, так и на уровне базы данных (не говоря уже о том, что платформы ORM добавляют еще один уровень абстракции, который еще более усложняет ситуацию).
Вам не нужно делать это.Например, если вы используете java.util.Calendar и манипулируете временем в каком-то определенном пользователем часовом поясе:
Calendar c = Calendar.getInstance(TimeZone.getTimeZone("America/New_York"));
c.set(Calendar.YEAR, 2011);
c.set(Calendar.MONTH, 0);
c.set(Calendar.DAY_OF_MONTH, 1);
c.set(Calendar.HOUR_OF_DAY, 3);
c.set(Calendar.MINUTE, 0);
c.set(Calendar.SECOND, 0);
c.set(Calendar.MILLISECOND, 0);
Это представляет «мгновенное» время независимо от часового пояса.Вы должны быть в состоянии сохранить это время в базе данных и из нее, не беспокоясь о каких-либо «конверсиях».Не должно иметь значения, находится ли база данных в часовом поясе Шанхая, а веб-сервер - в часовом поясе Лос-Анджелеса - момент времени одинаков, независимо от того,
Одна проблема - , некоторые базы данных пытаютсяуправлять часовыми поясами для вас (я смотрю на вас, Postgres! grr!) и, что еще хуже, поведение на уровне драйвера JDBC зависит от поставщика - т.е. PreparedStatement.setDate / getDate.
Ментальная модель, которую использует date4j, похоже, избавляет от всей путаницы.Например, явное принудительное использование использует часовой пояс при вызове now ().На сайте есть несколько очень хороших рекомендаций по использованию библиотеки (эти вещи, которые я уже делал в моем собственном приложении ранее), такие как:
- не используют тип базы данных, который пытается управлять часовыми поясами
- хранить часовой пояс в виде отдельного столбца (если требуется)
Почему больше людей не принимают такие библиотеки, как date4j?