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
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.
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.
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.
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 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.
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.
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 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.
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.
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 — 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.
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.
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 — 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.
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.
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
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.
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.
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.
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.
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
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.