, я недавно наткнулся на date4j , чрезвычайно простую библиотеку (по сути, один класс) для работы с датами в Java. Концептуально мне очень нравится "идея" date4j. Фактически, после прочтения всего основного сайта и документации в javadoc, я в значительной степени согласен со всем изложенным.
Теперь может быть несколькими причинами, по которым мне не следует использовать date4j - ошибки производительность, недостаток пользователей и т. д. Я не спрашиваю об этих вещах. Я спрашиваю, концептуально, что не так с идеей date4j (для большинства приложений)? Конечно, могут быть некоторые приложения, которым нужно что-то вроде joda или threeten, но я считаю, что их меньшинство.
Обычный совет, который люди дают пользователям, имеющим дело с датой / временем (почти каждый, кто пишет java-приложение): что-то вроде:
Фактически, последние три пункта иллюстрируют проблемы с текущей ментальной моделью, с которой люди работают с датами. Люди пытаются управлять часовыми поясами как на уровне приложения, так и на уровне базы данных (не говоря уже о фреймворках 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?