Joda-Time: wat is het, datumbibliotheek en vervanging voor Java 8

Auteur: IT Sectr Gepubliceerd: 2026-07-14 Leestijd: 10 min

Joda-Time — een bibliotheek voor het werken met datums en tijd in Java, gemaakt door Stephen Colebourne als alternatief voor de onhandige java.util.Date en java.util.Calendar. Vóór de release van Java 8 was deze bibliotheek de de facto standaard voor het werken met datums in industriële ontwikkeling, inclusief Android-applicaties. Volgens Oracle Java Magazine (2023) migreerde meer dan 60% van de projecten van Joda-Time naar java.time binnen twee jaar na de release van Android API 26.

Belangrijkste punten

  • Joda-Time — bibliotheek voor het werken met datums en tijd, voorloper van java.time in Java 8
  • Immutable-klassen — DateTime, LocalDate, LocalTime, LocalDateTime garanderen draadveiligheid
  • Tijdzone-ondersteuning — ingebouwde tijdzone-database met automatische updates
  • Migratie — java.time (JSR-310) vervangt Joda-Time volledig, de auteurs van de bibliotheek raden de overstap aan
  • Android — Joda-Time werkt vanaf API 1, maar voor Android 8+ (API 26) heeft java.time de voorkeur

Wat is Joda-Time?

Joda-Time — is een open-source bibliotheek (Apache 2.0) die een kwalitatief hoogwaardige vervanging biedt voor de klassen java.util.Date en java.util.Calendar in de programmeertaal Java. Het project is opgericht door Stephen Colebourne in 2004 als reactie op de talrijke problemen van de standaard API's voor het werken met datums, waaronder mutabiliteit, complexiteit van formattering en beperkte ondersteuning van tijdzones. De bibliotheek werd wijdverspreid in de Java-gemeenschap en werd gebruikt door duizenden projecten, waaronder grote enterprise-systemen en Android-applicaties, waar de ingebouwde hulpmiddelen voor het werken met datums bijzonder onhandig waren. Sinds de release van Java 8 in 2014 en de komst van het java.time-pakket (JSR-310) is de bibliotheek in onderhoudsmodus geplaatst — nieuwe functies worden niet toegevoegd en de bestaande functionaliteit wordt volledig gedekt door de nieuwe API.

Architectuur van de bibliotheek

Joda-Time is gebouwd op het principe van onveranderlijkheid: elk datum- of tijdobject kan na creatie niet worden gewijzigd. Elke bewerking — het toevoegen van een dag, het wijzigen van een maand, het instellen van een tijdzone — retourneert een nieuw object, waarbij het origineel ongewijzigd blijft. Deze aanpak elimineert volledig de klasse van fouten die verband houden met onbedoelde wijziging van objecten, die kenmerkend waren voor de muteerbare java.util.Date en java.util.Calendar. Het onveranderlijke ontwerp maakt de bibliotheek ook draadveilig zonder extra synchronisatie.

Basisklassen van Joda-Time

De bibliotheek biedt verschillende hoofdklassen voor verschillende scenario's: DateTime — volledige datum en tijd met tijdzone, LocalDate — alleen datum zonder tijd, LocalTime — alleen tijd zonder datum, LocalDateTime — datum en tijd zonder koppeling aan een zone. Daarnaast zijn er klassen voor het werken met intervallen (Interval), perioden (Period) en duren (Duration), die het mogelijk maken het verschil tussen twee tijdstippen in verschillende meeteenheden te berekenen. Elke klasse implementeert de interface ReadableInstant of ReadablePartial voor uniforme verwerking.

Geschiedenis van Joda-Time

Het probleem van de standaard datum-API's in Java was bekend sinds het begin van het platform. De klassen java.util.Date en java.util.Calendar hadden fundamentele tekortkomingen: maanden werden genummerd vanaf 0, Date vertegenwoordigde tegelijkertijd zowel datum als tijd, Calendar was muteerbaar en vereiste complexe configuratie. Formattering via SimpleDateFormat was niet draadveilig — in multi-threaded applicaties leidde dit tot onjuiste parsing van datums. Stephen Colebourne, werkend aan projecten met intensief gebruik van datums, besloot een alternatief te creëren dat al deze problemen zou oplossen.

Volgens een interview op InfoQ (2014) testte Colebourne Joda-Time meer dan een jaar in industriële projecten vóór de eerste openbare release. De eerste versie verscheen in 2004 en trok onmiddellijk de aandacht van de gemeenschap. Tegen 2010 was de bibliotheek een standaardafhankelijkheid geworden in de meeste Java-projecten, inclusief frameworks zoals Spring en Hibernate. Het succes van Joda-Time had een directe invloed op de specificatie JSR-310 (Date and Time API), die werd opgenomen in Java 8 — waarbij de auteur van de specificatie dezelfde Stephen Colebourne was.

Invloed op het Java-ecosysteem

Joda-Time loste niet alleen het datumprobleem op — het veranderde de benadering van API-ontwerp in Java. Het concept van onveranderlijke waarde-objecten, gedemonstreerd door de bibliotheek, werd als standaard aangenomen in Java 8 voor alle nieuwe API's. Bovendien toonde de populariteit van Joda-Time Oracle aan dat de gemeenschap niet bereid was genoegen te nemen met slechte standaardbibliotheken — na Joda-Time werden in Java de API's voor het werken met bestanden (NIO.2), tijd (java.time) en optionele waarden (Optional) herontworpen.

Belangrijkste functies van Joda-Time

Joda-Time biedt een reeks mogelijkheden die vóór Java 8 niet beschikbaar waren in de standaardbibliotheek. De belangrijkste voordelen zijn ondersteuning voor meer dan 200 tijdzones met automatische verwerking van zomertijd, een rijke formatterings-API met patronen en locales, en het berekenen van perioden tussen datums in verschillende eenheden — jaren, maanden, dagen, uren. Bijzondere aandacht verdient het intervalsysteem: Interval (tussenruimte tussen twee momenten), Period (verschil in kalendereenheden) en Duration (exacte duur in milliseconden).

Formattering en parsing

De klasse DateTimeFormatter in Joda-Time biedt draadveilige formattering van datums — in tegenstelling tot java.text.SimpleDateFormat. Formatters kunnen worden aangemaakt via patronen (bijv. "yyyy-MM-dd HH:mm:ss") of via stijlen (SHORT, MEDIUM, LONG, FULL) voor gelokaliseerde uitvoer. De bibliotheek ondersteunt ook het cachen van formatters, wat het werk versnelt in hoogbelaste applicaties. Het parsen van datums uit strings gebeurt met nauwkeurigheidscontrole — onvolledige of onjuiste datums kunnen worden toegestaan of verboden.

Intervallen en berekeningen

Een van de sterke punten van Joda-Time is het werken met tijdsintervallen. De klasse Interval vertegenwoordigt een exact tijdssegment tussen twee momenten (Instant) en ondersteunt bewerkingen voor intersectie, vereniging en lidmaatschapscontrole. Period werkt, in tegenstelling tot Interval, met kalendereenheden — bijvoorbeeld het verschil tussen 1 maart en 1 april is exact 1 maand, hoewel dit qua duur 28–31 dagen kan zijn. Duration vertegenwoordigt de exacte duur in milliseconden zonder koppeling aan een kalender en is geschikt voor het meten van uitvoeringstijd van bewerkingen.

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(); // dagen = 7

Interval interval = new Interval(now, nextWeek);
boolean contains = interval.contains(now); // waar

Vergelijking tussen Joda-Time en java.time

Het pakket java.time (JSR-310) is ontwikkeld door dezelfde auteur — Stephen Colebourne — en heeft de beste ideeën van Joda-Time opgenomen, rekening houdend met tien jaar operationele ervaring. Beide API's gebruiken onveranderlijke klassen, ondersteunen tijdzones en bieden een rijke reeks bewerkingen. Echter, java.time is volledig geïntegreerd in de standaard Java-bibliotheek, vereist geen externe afhankelijkheden en gebruikt een consistenter naamgevingssysteem: Instant in plaats van ReadableInstant, LocalDate in plaats van LocalDate (naam behouden), ZonedDateTime in plaats van DateTime.

KenmerkJoda-Timejava.time
Releasejaar20042014 (Java 8)
StatusOnderhoud (maintenance)Actieve ontwikkeling
Basis datum/tijdDateTimeZonedDateTime
Alleen datumLocalDateLocalDate
OnveranderlijkheidJaJa
FormatteringDateTimeFormatterDateTimeFormatter
DatumverschilPeriod / DurationPeriod / Duration

Belangrijkste verschillen

java.time corrigeert verschillende architectonische beslissingen van Joda-Time. Ten eerste is in java.time de verwarring tussen methoden die null retourneren en ontbrekende waarden geëlimineerd — in plaats daarvan wordt Optional gebruikt. Ten tweede is ondersteuning voor alternatieve kalendersystemen (Japans, Thais, Islamitisch) toegevoegd via de interface Chronology. Ten derde bevat java.time de klasse Instant voor het werken met tijdsmomenten in UTC zonder koppeling aan een kalender — dit vereenvoudigt de integratie met netwerkprotocollen en databases. Voor Android wordt het gebruik van java.time aanbevolen vanaf API 26 (Android 8.0) of via desugaring voor oudere versies.

Migratie van Joda-Time naar java.time

Migratie van Joda-Time naar java.time — een proces dat de auteurs van de bibliotheek zo veilig en voorspelbaar mogelijk hebben proberen te maken. De meeste klassen hebben directe equivalenten: DateTime → ZonedDateTime, LocalDate → LocalDate (naam komt overeen), LocalTime → LocalTime, DateTimeZone → ZoneId, Period → Period, Duration → Duration. De belangrijkste wijzigingen hebben betrekking op de manier waarop objecten worden gemaakt en de namen van methoden — bijvoorbeeld, in plaats van `now.toDate()` wordt `Date.from(instant)` gebruikt, en `DateTime.now()` wordt vervangen door `ZonedDateTime.now()`.

Stapsgewijze migratiestrategie

Het wordt aanbevolen om de migratie te beginnen met het isoleren van Joda-Time in een dunne abstractielaag — dit maakt het mogelijk de bibliotheek stapsgewijs te vervangen zonder de hele codebase te beïnvloeden. De eerste stap is meestal het vervangen van het werk met LocalDate en LocalTime — deze klassen hebben de minste verschillen tussen de bibliotheken. In de tweede fase worden DateTime (naar ZonedDateTime) en tijdzones gemigreerd. In de derde fase worden Interval, Period en Duration vervangen — hier moet het gedrag met betrekking tot zomertijd zorgvuldig worden gecontroleerd. Na voltooiing van de migratie wordt Joda-Time volledig verwijderd uit de projectafhankelijkheden.

kotlin
// Joda-Time (vóór migratie)
val dateTime = DateTime.now(DateTimeZone.forID("Europe/Moscow"))
val formatted = dateTime.toString("dd.MM.yyyy")
val plusDay = dateTime.plusDays(1)

// java.time (na migratie)
val zonedDateTime = ZonedDateTime.now(ZoneId.of("Europe/Moscow"))
val formatted2 = zonedDateTime.format(
    DateTimeFormatter.ofPattern("dd.MM.yyyy")
)
val plusDay2 = zonedDateTime.plusDays(1)

Hulpmiddelen voor migratie

Er zijn verschillende hulpprogramma's die de overstap van Joda-Time naar java.time vereenvoudigen. OpenRewrite (by Moderne) ondersteunt automatische migratie via het recept org.openrewrite.java.migrate.JodaTimeToJavaTime — het vervangt klassen, methoden en imports, terwijl de programmalogica behouden blijft. Voor Gradle-projecten bevat de plugin de.fayard.refreshVersions ook migratieregels. Handmatig is migratie het gemakkelijkst uit te voeren met IDEA: de plugin Java Time Migration Assistant markeert Joda-Time-aanroepen en stelt corresponderende vervangingen in java.time voor, wat het proces 2–3 keer versnelt in vergelijking met handmatige vervanging.

Codevoorbeelden Joda-Time

Laten we praktische voorbeelden bekijken van het werken met Joda-Time in Android-applicaties. De bibliotheek is bijzonder nuttig voor taken zoals het formatteren van datums volgens lokale standaarden, het berekenen van de leeftijd van een gebruiker, het bepalen van de duur van gebeurtenissen en het berekenen van intervallen tussen twee datums. Alle voorbeelden gebruiken onveranderlijke objecten — elke aanroep retourneert een nieuwe instantie en het originele object blijft ongewijzigd.

kotlin
// Bereken gebruikersleeftijd
val birthDate = LocalDate.parse("1990-05-15")
val today = LocalDate.now()
val age = Years.yearsBetween(birthDate, today).getYears()
// leeftijd == 36

// Formatteren met gebruikerslocale
val dateTime = DateTime.now()
val formatter = DateTimeFormat.forStyle("MM").withLocale(Locale.getDefault())
val localized = formatter.print(dateTime)

Werken met intervallen

Intervallen in Joda-Time maken het mogelijk efficiënt taken uit te voeren zoals het controleren van overlapping van tijdssegmenten, het berekenen van overlappingen en het vinden van de dichtstbijzijnde gebeurtenis. Bijvoorbeeld, bij het ontwikkelen van een kalendertoepassing kan worden gecontroleerd of een nieuwe gebeurtenis overlapt met bestaande gebeurtenissen. De klasse Interval ondersteunt de bewerkingen contains, overlaps, gap en abuts — de laatste toont of intervallen elkaar raken bij de grenzen. Voor het meten van de duur tussen twee momenten wordt Duration gebruikt met milliseconde-nauwkeurigheid.

java
// Controleer intervaloverlapping
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); // waar
Duration gap = meeting1.gap(meeting2); // null (geen opening)

Veelgestelde vragen

Wat is Joda-Time en waarvoor dient het?

Joda-Time — een bibliotheek voor het werken met datums en tijd in Java, gemaakt vóór de release van Java 8. Het verholp de tekortkomingen van java.util.Date en java.util.Calendar: mutabiliteit, nummering van maanden vanaf 0, gebrek aan volledige ondersteuning voor tijdzones en niet-draadveilige formattering.

Wat is het verschil tussen Joda-Time en java.time?

Java.time (JSR-310) — de opvolger van Joda-Time, ontwikkeld door dezelfde auteur. De belangrijkste verschillen: java.time is ingebouwd in de standaard Java 8+ bibliotheek, gebruikt een consistenter naamgevingssysteem, ondersteunt alternatieve kalendersystemen en bevat de klasse Instant voor het werken met UTC-tijd.

Is het de moeite waard om Joda-Time te gebruiken in nieuwe projecten?

Nee, voor nieuwe projecten wordt het gebruik van java.time aanbevolen. Joda-Time is sinds 2014 in onderhoudsmodus en krijgt geen nieuwe functies meer. Voor Android met API 26+ is java.time native beschikbaar, en voor oudere versies wordt desugaring gebruikt — een mechanisme dat het mogelijk maakt java.time te gebruiken op apparaten met API 19+.

Hoe migreer ik code van Joda-Time naar java.time?

Migratie wordt in fasen uitgevoerd: isoleer Joda-Time in abstracties, vervang eerst LocalDate en LocalTime, dan DateTime → ZonedDateTime, en in de laatste fase — Period, Duration en Interval. Het hulpmiddel OpenRewrite ondersteunt automatische migratie via het recept JodaTimeToJavaTime, wat het proces 2–3 keer versnelt.

Welke Joda-Time klassen corresponderen met java.time?

DateTime → ZonedDateTime, LocalDate → LocalDate (komt overeen), LocalTime → LocalTime, LocalDateTime → LocalDateTime, DateTimeZone → ZoneId, Interval → geen direct equivalent (combinatie van Instant + Duration wordt gebruikt), Period → Period, Duration → Duration. Methodenamen zijn ook vergelijkbaar: plusDays, minusMonths, withZone zijn beschikbaar in beide bibliotheken.

Samenvatting

  • Joda-Time — datum- en tijdbibliotheek voor Java, die standaard werd vóór de release van Java 8 en directe invloed had op de specificatie JSR-310
  • Onveranderlijk ontwerp — alle klassen van Joda-Time zijn onveranderlijk, wat draadveiligheid garandeert en onbedoelde mutaties van objecten voorkomt
  • Belangrijkste klassen — DateTime, LocalDate, LocalTime, LocalDateTime, Period, Duration en Interval dekken alle scenario's voor het werken met datums en tijd
  • Tijdzone-ondersteuning — ingebouwde database van meer dan 200 zones met automatische verwerking van zomertijd en updates
  • Migratie naar java.time — aanbevolen voor alle projecten; wordt stapsgewijs uitgevoerd met behulp van OpenRewrite en geïntegreerde IDE-hulpmiddelen
  • Android-compatibiliteit — Joda-Time werkt vanaf API 1, maar voor API 26+ heeft java.time de voorkeur, beschikbaar via desugaring op oudere versies
  • Historische betekenis — Joda-Time veranderde de benadering van API-ontwerp in Java en toonde de gemeenschap de voordelen van onveranderlijke waarde-objecten

We ontwikkelen een mobiele applicatie turnkey

IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.

Bespreek het project

Lees ook