До Java 8 использовать библиотеку времени и даты было сложно, и было много проблем, таких как безопасность потоков.
Время Joda компенсирует недостатки Java в этом отношении, но в Java8 увеличилосьjava.time
Пакет, улучшающий API даты Java и реализующий стандарт JSR-310. Официальная рекомендация Joda — перейти на библиотеку времени Java8.
Давайте подробно сравним и сопоставим две библиотеки, чтобы увидеть, действительно ли API даты Java8 может заменить время Joda.
Сравнение основных концепций
Основные концепции Joda Date, эти концепции могут в основном найти соответствующие аналоги во времени Java:
instant
Представляет момент в миллисекундах с 1970-01-01 00:00:00.
Joda time:
DateTime dt = new DateTime();
Instant instant = dt.toInstant();
Java time:
Clock clock = Clock.systemDefaultZone();
Instant instant = clock.instant();
interval
Указывает интервал между двумя мгновениями, левым закрытым и правым открытым.
Joda time:
DateTime dt = new DateTime();
DateTime dt1 = new DateTime();
Interval interval = new Interval(dt.toInstant(), dt1.toInstant());
В java нет аналогичного API, потому что эта концепция отсутствует в стандарте JSR-310.
duration
период времени в миллисекундах, обычно получаемый из интервала Время Джода:
DateTime dt = new DateTime();
DateTime dt1 = new DateTime();
Interval interval = new Interval(dt.toInstant(), dt1.toInstant());
Duration duration = interval.toInstant();
Java time:
LocalDateTime l1 = LocalDateTime.now();
LocalDateTime l2 = LocalDateTime.now();
Period period = Period.between(l1.toLocalDate(), l2.toLocalDate());
period
Выражается тот же период времени, например, 3 года, 5 месяцев, а продолжительность выражается в миллисекундах.
Joda time:
DateTime dt1 = new DateTime();
DateTime dt2 = new DateTime();
Period period = Period.fieldDifference(dt1.toLocalDateTime(), dt2.toLocalDateTime());
Java time:
LocalDateTime l1 = LocalDateTime.now();
LocalDateTime l2 = LocalDateTime.now();
Period period = Period.between(l1.toLocalDate(), l2.toLocalDate());
chronology
Хронология, положенная в основу конструкции йода-тайм
Joda time:
DateTime dt = new DateTime();
Chronology chronology = dt.getChronology();
Java time:
LocalDateTime localDateTime = LocalDateTime.now();
Chronology ch = localDateTime.getChronology();
timezones
Указывает часовой пояс.
Joda time:
DateTime dt = new DateTime();
DateTimeZone dateTimeZone = dt.getZone();
Set<String> zones = DateTimeZone.getAvailableIDs();
Java time:
Clock clock = Clock.systemDefaultZone();
ZoneId zoneId = clock.getZone();
Set<String> zones = ZoneId.getAvailableZoneIds();
Как видно из вышеизложенного, за исключением определения Interval, которого нет в JSR-310, две библиотеки мало чем отличаются в реализации основных концепций.
Поскольку система Unix начинает отсчет времени с 1970-01-01 00:00:00, это время также называется временем эпохи, и этот метод измерения времени Unix используется позже.
конкретное использование
Время Joda зависит от JDK5 и более поздних версий, никаких дополнительных зависимостей.
Для того, чтобы воспроизвести эффект контраста, несколько часто используемых сравнений выбора сцены:
- Получает количество миллисекунд с 1970 года.
- получить текущее время
- Получить год, месяц, день, день недели
- изменение даты
- форматирование даты
получить отметку времени
В коде эта функция часто используется для выражения уникальности:
Joda time:
DateTime dt = new DateTime();
long mills = dt.getMillis();
Java time:
Clock clock = Clock.systemDefaultZone();
long mills = clock.millis();
получить текущее время
Между этими двумя библиотеками нет большой разницы:
Joda time:
DateTime dt = new DateTime();
LocalDateTime localDateTime = dt.toLocalDateTime();
Java time:
LocalDateTime localDateTime = LocalDateTime.now();
Получить год, месяц, день, день недели
Joda time:
DateTime dt = new DateTime();
int dayOfYear = dt.getDayOfYear();
int dayOfMonth = dt.getDayOfMonth();
int dayOfWeek = dt.getDayOfWeek();
int hourOfDay = dt.getHourOfDay();
Java time:
Clock clock = Clock.systemDefaultZone();
LocalDateTime localDateTime = LocalDateTime.now(clock);
int dayOfYear = localDateTime.getDayOfYear();
int dayOfMonth = localDateTime.getDayOfMonth();
int dayOfWeek = localDateTime.getDayOfWeek().getValue();
int hourOfDay = localDateTime.getHour();
Между двумя библиотеками нет большой разницы для получения этих значений, но для некоторых сценариев, например, я хочу получить строку «Четверг».
В библиотеке Joda вы можетеdt.dayOfWeek().getAsShortText(); // 星期四
так получается. В Яве,localDateTime.getDayOfWeek().name(); //THURSDAY
Я могу получить только на английском языке.
Время Joda лучше справляется с локализацией, чем время Java.
Увеличение или уменьшение даты
Joda time:
DateTime dt = new DateTime();
dt = dt.plusDays(2); //当前日期添加两天
dt = dt.plusHours(5); // 当前时间加上两个小时
dt = dt.minusDays(1); // 当前日期减一天
dt = dt.minusHours(2); // 当前日期减两个小时
Java time:
LocalDateTime localDateTime = LocalDateTime.now();
localDateTime = localDateTime.plusDays(2); // 增加两天
localDateTime = localDateTime.plusHours(2); // 增加两个小时
localDateTime = localDateTime.minusDays(1); //减少一天
localDateTime = localDateTime.minusHours(1); // 减少一个小时
форматирование даты
Форматирование даты — наиболее часто используемая функция в повседневной жизни, давайте сравним различия между ними.
Joda time:
// 方式一
DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss");
DateTime dt = new DateTime();
System.out.println(dt.toString(formatter));
// 方式二
String dateFormat = "yyyy-MM-dd HH:mm:ss";
System.out.println(dt.toString(dateFormat));
Java time:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime localDateTime = LocalDateTime.now(); System.out.println(formatter.format(localDateTime));
Приведенное выше сравнение показывает, что обе библиотеки могут выполнять одну и ту же функцию. Хотя есть небольшие отличия в деталях.
java.util.Date — это самый ранний класс даты в Java, и позже этот класс устарел, а java.util.Calendar используется для замены Date. Calendar имеет все функции Date и предоставляет более богатый API для получения года, месяца и дня.
Calendar — это виртуальный класс, а GregorianCalendar — это класс реализации Calendar.
Время Java и класс времени в java.util взаимно преобразуются, а дата или календарь могут быть преобразованы в LocalDateTime во времени Java.
java.util.Date в java.time.LocalDateTime:
Date date = new Date();
LocalDateTime localDateTime = LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault());
java.util.Carlendar в java.time.LocalDateTime:
Calendar calendar = Calendar.getInstance();
LocalDateTime localDateTime = LocalDateTime.ofInstant(calendar.toInstant(), ZoneId.systemDefault());
Время Joda также можно преобразовать в java.util.Date и обратно:
// from Joda to JDK
DateTime dt = new DateTime();
Date jdkDate = dt.toDate();
// from JDK to Joda
dt = new DateTime(jdkDate);
// from Joda to JDK
DateTime dt = new DateTime();
Calendar jdkCal = dt.toCalendar(Locale.CHINESE);
// from JDK to Joda
dt = new DateTime(jdkCal);
// from Joda to JDK
DateTime dt = new DateTime();
GregorianCalendar jdkGCal = dt.toGregorianCalendar();
// from JDK to Joda
dt = new DateTime(jdkGCal);
дизайн-мышление
JODA TIME и Java Time функционально различны, и у них есть общие функции. Эти две библиотеки классов могут быть завершены, и обе библиотеки являются потоками.
Joda Time, но я думаю, что некоторые из более простого API, используйте время Joda, может начать напрямую из класса DateTime. Использование времени Java еще более громоздким.
По дизайну Java time больше не использует new для создания экземпляров, а вместо этого использует фабричные методы для создания экземпляров. Это лучше, чем дизайн Joda time, и более безопасно.
Поскольку время Joda рекомендует вернуться к времени Java, в конечном итоге оно должно быть перенесено. Но на данный момент я думаю, что время Joda легче использовать, и я продолжу использовать его в настоящее время.
Обратите внимание на публичный аккаунт WeChat, пообщайтесь о других