Joda-Time: шта је то, библиотека датума и замена за Java 8

Аутор: IT Sectr Објављено: 2026-07-14 Време читања: 10 мин

Joda-Time — библиотека за рад са датумима и временом у Java-и, коју је створио Стивен Колборн као алтернативу незгодним java.util.Date и java.util.Calendar. Пре изласка Java 8, ова библиотека је била де факто стандард за рад са датумима у индустријском развоју, укључујући Android апликације. Према подацима Oracle Java Magazine (2023), више од 60% пројеката мигрирало је са Joda-Time на java.time у року од две године након изласка Android API 26.

Главно

  • Joda-Time — библиотека за рад са датумима и временом, претходник java.time у Java 8
  • Immutable-класе — DateTime, LocalDate, LocalTime, LocalDateTime обезбеђују безбедност нити
  • Подршка за временске зоне — уграђена база временских зона са аутоматским ажурирањима
  • Миграција — java.time (JSR-310) у потпуности замењује Joda-Time, аутори библиотеке препоручују прелазак
  • Android — Joda-Time ради од API 1, али за Android 8+ (API 26) пожељнији је java.time

Шта је Joda-Time?

Joda-Time — је библиотека отвореног кода (Apache 2.0) која пружа квалитетну замену за класе java.util.Date и java.util.Calendar у језику Java. Пројекат је основао Стивен Колборн 2004. године као одговор на бројне проблеме стандардних API-ја за рад са датумима, укључујући мутабилност, сложеност форматирања и ограничену подршку за временске зоне. Библиотека је стекла широку распрострањеност у Java заједници и коришћена је у хиљадама пројеката, укључујући велике enterprise системе и Android апликације, где су уграђени алати за рад са датумима били посебно незгодни. Од изласка Java 8 2014. године и појаве пакета java.time (JSR-310), библиотека је пребачена у режим одржавања — нове функције се не додају, а постојећа функционалност је у потпуности покривена новим API-јем.

Архитектура библиотеке

Joda-Time је изграђена на принципу имутабилности: сваки објекат датума или времена након креирања не може бити измењен. Било која операција — додавање дана, промена месеца, постављање временске зоне — враћа нови објекат, остављајући оригинал непромењен. Овакав приступ потпуно eliminiše klasu grešaka povezanih sa nenamernom modifikacijom objekata, koje su bile karakteristične za mutabilne java.util.Date i java.util.Calendar. Имутабилни дизајн такође чини библиотеку безбедном за нити без додатне синхронизације.

Основне класе Joda-Time

Библиотека пружа неколико главних класа за различите сценарије: DateTime — пун датум и време са временском зоном, LocalDate — само датум без времена, LocalTime — само време без датума, LocalDateTime — датум и време без везивања за зону. Поред тога, укључене су класе за рад са интервалима (Interval), периодима (Period) и трајањима (Duration), које омогућавају израчунавање разлике између два временска тренутка у различитим мерним јединицама. Свака класа имплементира интерфејс ReadableInstant или ReadablePartial за једнообразну обраду.

Историја настанка Joda-Time

Проблем стандардних API-ја за датуме у Java-и био је познат од самог почетка платформе. Класе java.util.Date и java.util.Calendar имале су фундаменталне недостатке: месеци су нумерисани од 0, Date је истовремено представљао и датум и време, Calendar је био мутабилан и захтевао је сложено подешавање. Форматирање преко SimpleDateFormat није било безбедно за нити — у вишенитним апликацијама ово је доводило до нетачног парсирања датума. Стивен Колборн, радећи на пројектима са интензивним коришћењем датума, одлучио је да створи алтернативу која би поправила све ове проблеме.

Према интервјуу на InfoQ (2014), Колборн је тестирао Joda-Time у индустријским пројектима више од годину дана пре првог јавног издања. Прва верзија је изашла 2004. године и одмах привукла пажњу заједнице. До 2010. године библиотека је постала стандардна зависност у већини Java пројеката, укључујући оквире као што су Spring и Hibernate. Успех Joda-Time директно је утицао на спецификацију JSR-310 (Date and Time API), која је укључена у Java 8 — при чему је аутор спецификације био исти Стивен Колборн.

Утицај на Java екосистем

Joda-Time није само решила проблем датума — променила је приступ дизајну API-ја у Java-и. Концепт имутабилних вредносних објеката, демонстриран библиотеком, прихваћен је као стандард у Java 8 за све нове API-је. Штавише, популарност Joda-Time показала је Oracle-у да заједница није спремна да толерише неквалитетне стандардне библиотеке — након Joda-Time у Java-и су прерађени API-ји за рад са датотекама (NIO.2), временом (java.time) и опционим вредностима (Optional).

Кључне могућности библиотеке Joda-Time

Joda-Time пружа скуп могућности које пре Java 8 нису биле доступне у стандардној библиотеци. Главне предности укључују подршку за преко 200 временских зона са аутоматском обрадом летњег времена, богат API за форматирање са обрасцима и локалима, као и израчунавање периода између датума у различитим јединицама — годинама, месецима, данима, сатима. Посебну пажњу заслужује систем интервала: Interval (размак између два тренутка), Period (разлика у календарским јединицама) и Duration (тачно трајање у милисекундама).

Форматирање и парсирање

Класа DateTimeFormatter у Joda-Time пружа безбедно форматирање датума за нити — за разлику од java.text.SimpleDateFormat. Форматери се могу креирати преко образаца (нпр. "yyyy-MM-dd HH:mm:ss") или преко стилова (SHORT, MEDIUM, LONG, FULL) за локализовани излаз. Библиотека такође подржава кеширање форматера, што убрзава рад у високооптерећеним апликацијама. Парсирање датума из стрингова се врши са контролом строгости — може се дозволити или забранити непотпун или нетачан датум.

Интервали и израчунавања

Једна од јаких страна Joda-Time је рад са временским размацима. Класа Interval представља тачан временски одсечак између два тренутка (Instant) и подржава операције preseka, ujedinjenja i provere pripadnosti. Period, за разлику од Interval-а, оперише календарским јединицама — на пример, разлика између 1. марта и 1. априла износи тачно 1 месец, иако по трајању то може бити 28–31 дан. Duration представља тачно трајање у милисекундама без везивања за календар и погодан је за мерење времена извршења операција.

java
import org.joda.time.*;
import org.joda.time.format.*;

DateTime now = new DateTime();
DateTimeFormatter fmt = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss");
String formatted = fmt.print(now);

DateTime nextWeek = now.plusWeeks(1);
Period period = new Period(now, nextWeek);
int days = period.getDays(); // дани = 7

Interval interval = new Interval(now, nextWeek);
boolean contains = interval.contains(now); // тачно

Поређење Joda-Time и java.time

Пакет java.time (JSR-310) развио је исти аутор — Стивен Колборн — и апсорбовао најбоље идеје Joda-Time, узимајући у обзир десет година експлоатационог искуства. Оба API-ја користе имутабилне класе, подржавају временске зоне и пружају богат скуп операција. Међутим, java.time је потпуно интегрисан у стандардну библиотеку Java-е, не захтева спољне зависности и користи доследнији систем именовања: Instant уместо ReadableInstant, LocalDate уместо LocalDate (назив задржан), ZonedDateTime уместо DateTime.

КарактеристикаJoda-Timejava.time
Година изласка20042014 (Java 8)
СтатусОдржавање (maintenance)Активни развој
Основни датум/времеDateTimeZonedDateTime
Само датумLocalDateLocalDate
ИмутабилностДаДа
ФорматирањеDateTimeFormatterDateTimeFormatter
Разлика датумаPeriod / DurationPeriod / Duration

Кључне разлике

java.time поправља неколико архитектонских одлука Joda-Time-а. Прво, у java.time-у је eliminisana konfuzija između metoda koje vraćaju null i vrednosti koje nedostaju — umesto toga koristi se Optional. Друго, додата је подршка за алтернативне календарске системе (јапански, тајландски, исламски) преко интерфејса Chronology. Треће, java.time укључује класу Instant за рад са тренуцима времена у UTC-у без везивања за календар — ово поједностављује интеграцију са мрежним протоколима и базама података. За Android се препоручује коришћење java.time од API 26 (Android 8.0) или преко desugaring-а за старије верзије.

Миграција са Joda-Time на java.time

Миграција са Joda-Time на java.time — процес који су аутори библиотеке настојали да учине максимално безбедним и предвидљивим. Већина класа има директне аналогије: DateTime → ZonedDateTime, LocalDate → LocalDate (назив се поклапа), LocalTime → LocalTime, DateTimeZone → ZoneId, Period → Period, Duration → Duration. Главне промене се тичу начина креирања објеката и назива метода — на пример, уместо `now.toDate()` користи се `Date.from(instant)`, а `DateTime.now()` се замењује са `ZonedDateTime.now()`.

Корачна стратегија миграције

Препоручује се да миграција почне изолацијом Joda-Time у танком слоју апстракције — ово ће омогућити замену библиотеке у фазама, без утицаја на целокупну базу кода. Првим кораком обично се замењује рад са LocalDate и LocalTime — ове класе имају најмање разлика између библиотека. Другом фазом мигрирају се DateTime (на ZonedDateTime) и временске зоне. Трећом фазом замењују се Interval, Period и Duration — овде треба пажљиво проверити понашање узимајући у обзир летње време. Након завршетка миграције, Joda-Time се потпуно уклања из зависности пројекта.

kotlin
// Joda-Time (пре миграције)
val dateTime = DateTime.now(DateTimeZone.forID("Europe/Moscow"))
val formatted = dateTime.toString("dd.MM.yyyy")
val plusDay = dateTime.plusDays(1)

// java.time (после миграције)
val zonedDateTime = ZonedDateTime.now(ZoneId.of("Europe/Moscow"))
val formatted2 = zonedDateTime.format(
    DateTimeFormatter.ofPattern("dd.MM.yyyy")
)
val plusDay2 = zonedDateTime.plusDays(1)

Алати за миграцију

Постоји неколико алата који олакшавају прелазак са Joda-Time на java.time. OpenRewrite (by Moderne) подржава аутоматску миграцију кроз рецепт org.openrewrite.java.migrate.JodaTimeToJavaTime — замењује класе, методе и импорте, чувајући логику програма. За Gradle пројекте, додатак de.fayard.refreshVersions такође укључује правила миграције. Ручно миграција се најлакше спроводи са IDEA: додатак Java Time Migration Assistant истиче позиве Joda-Time-а и предлаже одговарајуће замене у java.time-у, што убрзава процес 2–3 пута у поређењу са ручном заменом.

Примери кода Joda-Time

Размотримо практичне примере рада са Joda-Time у Android апликацијама. Библиотека је посебно корисна за задатке форматирања датума према локалним стандардима, израчунавање старости корисника, одређивање трајања догађаја и израчунавање интервала између два датума. Сви примери користе имутабилне објекте — сваки позив враћа нову инстанцу, а оригинални објекат остаје непромењен.

kotlin
// Израчунај старост корисника
val birthDate = LocalDate.parse("1990-05-15")
val today = LocalDate.now()
val age = Years.yearsBetween(birthDate, today).getYears()
// године == 36

// Форматирај са локалом корисника
val dateTime = DateTime.now()
val formatter = DateTimeFormat.forStyle("MM").withLocale(Locale.getDefault())
val localized = formatter.print(dateTime)

Рад са интервалима

Интервали у Joda-Time омогућавају ефикасно решавање задатака провере пресецања временских одсечака, израчунавања преклапања и проналажења најближег догађаја. На пример, при развоју календарске апликације може се проверити да ли се нови догађај преклапа са постојећим. Класа Interval подржава операције contains, overlaps, gap и abuts — последња показује да ли се интервали додирују границама. За мерење трајања између два тренутка користи се Duration са прецизношћу до милисекунди.

java
// Провери преклапање интервала
Interval meeting1 = new Interval(
    new DateTime(2026, 7, 21, 10, 0),
    new DateTime(2026, 7, 21, 11, 0)
);
Interval meeting2 = new Interval(
    new DateTime(2026, 7, 21, 10, 30),
    new DateTime(2026, 7, 21, 11, 30)
);

boolean overlaps = meeting1.overlaps(meeting2); // тачно
Duration gap = meeting1.gap(meeting2); // null (без размака)

Често постављана питања

Шта је Joda-Time и чему служи?

Joda-Time — библиотека за рад са датумима и временом у Java-и, створена пре изласка Java 8. Она је исправљала недостатке java.util.Date и java.util.Calendar: мутабилност, нумерисање месеци од 0, недостатак потпуне подршке за временске зоне и небезбедно форматирање за нити.

Чим се Joda-Time разликује од java.time?

Java.time (JSR-310) — наследник Joda-Time-а, развијен од истог аутора. Главне разлике: java.time је уграђен у стандардну библиотеку Java 8+, користи доследнији систем именовања, подржава алтернативне календарске системе и укључује класу Instant за рад са UTC временом.

Да ли вреди користити Joda-Time у новим пројектима?

Не, за нове пројекте препоручује се коришћење java.time. Joda-Time је у режиму одржавања од 2014. године и више не добија нове функције. За Android са API 26+, java.time је доступан изворно, а за старије верзије користи се desugaring — механизам који омогућава коришћење java.time на уређајима са API 19+.

Како мигрирати код са Joda-Time на java.time?

Миграција се изводи у фазама: изолујте Joda-Time у апстракцијама, замените прво LocalDate и LocalTime, затим DateTime → ZonedDateTime, и у последњој фази — Period, Duration и Interval. Алат OpenRewrite подржава аутоматску миграцију кроз рецепт JodaTimeToJavaTime, што убрзава процес 2–3 пута.

Које класе Joda-Time одговарају java.time?

DateTime → ZonedDateTime, LocalDate → LocalDate (поклапа се), LocalTime → LocalTime, LocalDateTime → LocalDateTime, DateTimeZone → ZoneId, Interval → нема директан аналог (користи се комбинација Instant + Duration), Period → Period, Duration → Duration. Називи метода су такође блиски: plusDays, minusMonths, withZone доступни су у обе библиотеке.

Резиме

  • Joda-Time — библиотека датума и времена за Java, која је постала стандард пре изласка Java 8 и директно утицала на спецификацију JSR-310
  • Имутабилни дизајн — све класе Joda-Time су непроменљиве, што гарантује безбедност нити и спречава случајне мутације објеката
  • Кључне класе — DateTime, LocalDate, LocalTime, LocalDateTime, Period, Duration и Interval покривају све сценарије рада са датумима и временом
  • Подршка за временске зоне — уграђена база преко 200 зона са аутоматском обрадом преласка на летње време и ажурирањима
  • Миграција на java.time — препоручује се за све пројекте; изводи се у фазама, коришћењем алата OpenRewrite и уграђених IDE алата
  • Android компатибилност — Joda-Time ради од API 1, али за API 26+ је пожељнији java.time, доступан кроз desugaring на старијим верзијама
  • Историјски значај — Joda-Time је променила приступ дизајну API-ја у Java-и и показала заједници предности имутабилних вредносних објеката

Развићемо мобилну апликацију под кључ

IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.

Разговарајте о пројекту

Прочитајте такође