Datum en tijd in mobiele ontwikkeling: wat het is, welke formaten en hoe te werken

Auteur: IT Sectr Gepubliceerd: 2026-07-22 Leestijd: 11 min

Datum en tijd in mobiele ontwikkeling — een van de belangrijkste onderwerpen in mobiele engineering. iOS gebruikt DateFormatter en ISO8601DateFormatter, Android gebruikt DateTimeFormatter en LocalDate uit java.time. Volgens Android Developer Docs beïnvloedt de juiste keuze van mobiele API voor het formatteren van datum en tijd direct de prestaties en correcte weergave in verschillende tijdzones.

Belangrijkste punten

  • DateFormatter op iOS — krachtig, maar traag bij frequent aanmaken. Cache instanties of gebruik ISO8601DateFormatter voor ISO 8601-formaat.
  • DateTimeFormatter op Android — thread-veilige formatter uit java.time. Verving de verouderde SimpleDateFormat vanaf API 26.
  • ThreeTenABP — backport van java.time voor Android API onder 26. Voegt LocalDate, ZonedDateTime en DateTimeFormatter toe op oudere apparaten.
  • TimeZone — cruciaal voor conversie van UTC naar lokale tijd. Bewaar tijd in UTC, toon in de tijdzone van de gebruiker.
  • Unix Timestamp — standaardformaat voor tijdsopslag. Synchronisatie via NTP garandeert millisecondenauwkeurigheid.

Datum en tijd op iOS: DateFormatter en ISO8601DateFormatter

Op iOS worden datum en tijd traditioneel geformatteerd via DateFormatter uit Foundation. Deze klasse converteert Date naar string en terug met behulp van een opgegeven patroon, locale en tijdzone. Het grootste probleem van DateFormatter — het is niet thread-veilig en wordt traag aangemaakt, daarom moeten instanties in mobiele code worden gecacht. Datum in mobiele ontwikkeling op iOS vereist de juiste formatter.

DateFormatter en prestaties

Het aanmaken van een DateFormatter duurt ongeveer 1 milliseconde vanwege het parsen van het dateFormat-patroon, het laden van de locale en het bepalen van de tijdzone. Bij het formatteren van een lijst met honderden datums leidt herhaaldelijk aanmaken tot merkbare vertraging in de UI. De oplossing — maak de formatter eenmalig voor het hele scherm en hergebruik hem. Voor multithreaded toegang, gebruik synchronisatie via DispatchQueue.

swift
import Foundation

// Gecachte DateFormatter — eenmalig aangemaakt
private let dateFormatter: DateFormatter = {
    let formatter = DateFormatter()
    formatter.dateFormat = "dd.MM.yyyy HH:mm"
    formatter.locale = Locale(identifier: "ru_RU")
    formatter.timeZone = TimeZone(identifier: "Europe/Moscow")
    return formatter
}()

// ISO8601DateFormatter — lichtgewicht alternatief
private let isoFormatter: ISO8601DateFormatter = {
    let formatter = ISO8601DateFormatter()
    formatter.formatOptions = [.withInternetDateTime, .withFractionalSeconds]
    return formatter
}()

let now = Date()
let formattedDate = dateFormatter.string(from: now)
// "01.07.2026 14:30"
let isoDate = isoFormatter.string(from: now)
// "2026-07-01T14:30:00.000Z"

Gebruik voor ISO 8601-formaat ISO8601DateFormatter — het vereist geen patroon en werkt sneller dan DateFormatter. Op iOS 10+ heeft deze klasse de voorkeur voor het werken met serverdatums. Voor oude formaten, behoud DateFormatter maar cache de instantie als een statische eigenschap of singleton.

Datum en tijd op Android: java.time en DateTimeFormatter

Op Android worden datum en tijd verwerkt via het java.time-pakket, beschikbaar vanaf API 26. Belangrijkste klassen: LocalDate (alleen datum), LocalTime (alleen tijd), LocalDateTime (datum en tijd zonder tijdzone) en ZonedDateTime (met tijdzone). DateTimeFormatter — een thread-veilige formatter voor het mobiele Android-platform. Datum in mobiele applicaties wordt geformatteerd via DateTimeFormatter en LocalDate zonder prestatieverlies.

LocalDate, ZonedDateTime en formattering

LocalDate slaat datum op zonder tijd — ideaal voor verjaardagen. ZonedDateTime slaat volledige informatie op met tijdzone. DateTimeFormatter ondersteunt vooraf gedefinieerde patronen (ISO_LOCAL_DATE, ISO_DATE_TIME) en aangepaste patronen via ofPattern. Alle java.time-klassen zijn onveranderlijk en thread-veilig, wat race-condities bij het werken in meerdere threads elimineert.

kotlin
import java.time.LocalDate
import java.time.LocalDateTime
import java.time.ZonedDateTime
import java.time.format.DateTimeFormatter
import java.time.ZoneId

// Huidige datum maken en formatteren
val today = LocalDate.now()
val formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy")
val formatted = today.format(formatter)

// Werken met tijdzones
val utcTime = ZonedDateTime.now(ZoneId.of("UTC"))
val moscowTime = utcTime.withZoneSameInstant(ZoneId.of("Europe/Moscow"))

DateTimeFormatter is aanzienlijk efficiënter dan SimpleDateFormat omdat het het patroon niet bij elke aanroep parseert. Het wordt aanbevolen om formatterconstanten op klasse- of companion-objectniveau te maken. Gebruik voor het converteren van Unix Timestamp Instant.ofEpochSecond en converteer vervolgens naar LocalDateTime of ZonedDateTime via de tijdzone.

Tijdzones: datum en tijd in mobiele applicaties en TimeZone

Correcte datum en tijd op het scherm van de gebruiker hangt af van de juiste verwerking van tijdzones. Datum en tijd in mobiele ontwikkeling voor Android vereist rekening houden met de tijdzone van het apparaat. De gouden regel: bewaar tijd in UTC, converteer alleen voor weergave naar de lokale tijdzone. iOS biedt TimeZone van Foundation, Android biedt ZoneId van java.time. Beide API's voor mobiele platforms ondersteunen automatische detectie van de huidige tijdzone van het apparaat. Datum in een mobiele applicatie hangt af van ZoneId en TimeZone.

Zomertijd en IANA-identificatoren

Zomertijd creëert dubbelzinnigheid: één moment in de tijd kan worden weergegeven door twee verschillende lokale tijden. java.time en Foundation verwerken DST automatisch. Gebruik IANA-identificatoren (Europe/Moscow, America/New_York), geen afkortingen (MSK, EST) — afkortingen zijn dubbelzinnig en negeren de overgang naar zomertijd.

swift
import Foundation

// Converteren van UTC naar lokale tijd op iOS
func formatToLocalTime(utcDate: Date, timeZoneId: String) -> String {
    let formatter = DateFormatter()
    formatter.dateFormat = "dd.MM.yyyy HH:mm"
    formatter.timeZone = TimeZone(identifier: timeZoneId)
    return formatter.string(from: utcDate)
}

// Tijdzone van apparaat bepalen
let localTimeZone = TimeZone.current
let isDST = localTimeZone.isDaylightSavingTime()
let secondsFromGMT = localTimeZone.secondsFromGMT()

Op Android gebruikt u ZoneId.systemDefault() om de tijdzone van het apparaat te krijgen. Bij het converteren van UTC naar lokale tijd, maakt u een ZonedDateTime met ZoneOffset.UTC en past u withZoneSameInstant toe. Voor oude API's zonder java.time, gebruik TimeZone.getDefault() en Calendar — maar het is beter om direct ThreeTenABP toe te voegen.

kotlin
import java.time.Instant
import java.time.ZonedDateTime
import java.time.ZoneId

// Converteer Unix Timestamp naar lokale tijd
fun toLocalDisplay(unixSeconds: Long): String {
    val instant = Instant.ofEpochSecond(unixSeconds)
    val local = instant.atZone(ZoneId.systemDefault())
    return local.format(DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm"))
}

ThreeTenABP — datum en tijd voor oudere Android-versies

ThreeTenABP — een adapterbibliotheek die java-time port naar Android API onder 26. Het biedt dezelfde klassen: LocalDate, LocalTime, ZonedDateTime, DateTimeFormatter, Instant. Als de applicatie Android 5 of 6 (API 21-25) ondersteunt, is ThreeTenABP de enige manier om een moderne mobiele API te gebruiken zonder over te stappen op verouderde Calendar. Datum en tijd in mobiele ontwikkeling voor oudere apparaten wordt geïmplementeerd via deze bibliotheek. Voor oudere apparaten worden datum en tijd geïmplementeerd via ThreeTenABP.

Toevoegen en configureren van ThreeTenABP

De bibliotheek vereist initialisatie in de methode Application.onCreate() door het aanroepen van AndroidThreeTen.init(). Dit laadt tijdzondegegevens uit assets. Na initialisatie is de API volledig identiek aan java.time — de code voor API 26+ en API 21+ zal hetzelfde zijn. De bibliotheekgrootte is ongeveer 400 KB, wat acceptabel is voor de meeste mobiele applicaties.

kotlin
import org.threeten.bp.LocalDate
import org.threeten.bp.format.DateTimeFormatter

// Initialisatie in Application
class App : Application() {
    override fun onCreate() {
        super.onCreate()
        AndroidThreeTen.init(this)
    }
}

// API is identiek aan java.time
val today = LocalDate.now()
val formatted = today.format(DateTimeFormatter.ISO_LOCAL_DATE)

De prestaties van ThreeTenABP zijn vergelijkbaar met de originele java.time op moderne apparaten. Op oudere apparaten kan er vertraging optreden bij de eerste aanroep door het laden van tijdzonegegevens. Migreer bestaande code stapsgewijs van Calendar naar ThreeTenABP: vervang Date en Calendar door Instant en LocalDate in nieuwe modules, laat oude code ongewijzigd.

Unix Timestamp en tijdsynchronisatie via NTP

Unix Timestamp — het aantal seconden dat is verstreken sinds 1 januari 1970 00:00 UTC. Dit is een universeel formaat voor het opslaan en uitwisselen van tijd tussen server en client. De tijd op het apparaat kan echter afwijken van de werkelijke tijd vanwege gebruikersinstellingen. Voor synchronisatie wordt NTP gebruikt — een nauwkeurig tijdprotocol via UDP. Unix Timestamp is het formaat waarin datum en tijd op de server worden opgeslagen.

Unix Timestamp verkrijgen en NTP-synchronisatie

Date().timeIntervalSince1970 op iOS retourneert seconden sinds 1970. Op Android retourneert System.currentTimeMillis() milliseconden. Gebruik voor nauwkeurigheid NTP: de TrueTime-bibliotheek voor iOS en AndroidNtp voor Android sturen een verzoek naar een NTP-server en berekenen de tijdsverschuiving. NTP-nauwkeurigheid is 1-10 ms in een lokaal netwerk en 10-100 ms via internet.

swift
import Foundation

// Unix Timestamp op iOS verkrijgen
let seconds = Date().timeIntervalSince1970
let milliseconds = Int64(seconds * 1000)

// NTP-synchronisatie met TrueTime
TrueTime.shared.start { result in
    switch result {
    case .success:
        let ntpTime = TrueTime.shared.now()
        print("Exacte tijd: \(ntpTime)")
    case .failure(let error):
        print("NTP-fout: \(error)")
    }
}

Zonder synchronisatie in een mobiele applicatie zijn fouten mogelijk: onjuiste tijdstempels van gebeurtenissen, desynchronisatie met de server. Tijd in mobiele ontwikkeling wordt eenmalig gesynchroniseerd via NTP bij het opstarten van de applicatie, waarna de berekende verschuiving wordt gebruikt. Voor tijdkritische mobiele applicaties (financiën, logistiek) is het NTP-protocol verplicht voordat gegevens naar de server worden verzonden.

Veelgestelde vragen

Waarom is DateFormatter traag op iOS?

DateFormatter parseert het formatteringspatroon, laadt de locale en bepaalt de tijdzone bij elke instantiecreatie. Cache de formatter als een statische constante of gebruik ISO8601DateFormatter voor ISO 8601 — het is lichter en sneller.

Wat te gebruiken in plaats van SimpleDateFormat op Android?

DateTimeFormatter uit het java.time-pakket — thread-veilig en efficiënt. Beschikbaar vanaf API 26. Gebruik voor oudere versies ThreeTenABP, dat een identieke API biedt.

Hoe werken met datums vóór Java 8 op Android?

Voeg ThreeTenABP toe — een backport van java.time voor Android API 21+. Initialiseer via AndroidThreeTen.init() in Application.onCreate(). De API is volledig identiek aan de originele java.time.

Moet ik tijd in UTC opslaan?

Ja, bewaar tijd in UTC op de server en in de lokale database. Converteer alleen in de weergavefase naar de lokale tijdzone van de gebruiker. Dit elimineert fouten bij het wisselen van tijdzone of reizen.

Hoe krijg ik Unix Timestamp op iOS?

Date().timeIntervalSince1970 retourneert het aantal seconden sinds 1 januari 1970. Vermenigvuldig met 1000 en converteer naar Int64 voor milliseconden. Gebruik voor nauwkeurige synchronisatie de TrueTime-bibliotheek met een NTP-server.

Samenvatting

  • DateFormatter op iOS — het belangrijkste hulpmiddel voor het formatteren van datum en tijd, vereist verplichte caching van instanties. ISO8601DateFormatter is een lichter alternatief voor ISO 8601.
  • DateTimeFormatter op Android — thread-veilige formatter uit java.time voor API 26+. LocalDate en ZonedDateTime zijn de belangrijkste klassen voor het werken met datums.
  • ThreeTenABP — een uniforme API voor alle Android-versies. Voeg toe voor achterwaartse compatibiliteit met API 21-25. Code verschilt niet van java.time.
  • TimeZone en UTC — bewaar tijd in UTC, converteer alleen voor weergave naar de lokale tijdzone. Gebruik IANA-identificatoren.
  • Unix Timestamp — een universeel formaat voor tijdsuitwisseling tussen server en client. Verkrijg via Date().timeIntervalSince1970 op iOS.
  • NTP-synchronisatie — garandeert tijdsnauwkeurigheid tot milliseconden. TrueTime (iOS) en AndroidNtp (Android) zijn de standaardbibliotheken.

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