Datum und Uhrzeit in der mobilen Entwicklung: was es ist, welche Formate und wie man arbeitet

Autor: IT Sectr Veröffentlicht: 2026-07-22 Lesezeit: 11 Min.

Datum und Uhrzeit in der mobilen Entwicklung — eines der Schlüsselthemen im Mobile Engineering. iOS verwendet DateFormatter und ISO8601DateFormatter, Android verwendet DateTimeFormatter und LocalDate aus java.time. Laut Android Developer Docs wirkt sich die Wahl der richtigen mobilen API für die Datums- und Zeitformatierung direkt auf die Leistung und korrekte Anzeige in verschiedenen Zeitzonen aus.

Wichtige Punkte

  • DateFormatter auf iOS — leistungsstark, aber bei häufiger Erstellung langsam. Instanzen cachen oder ISO8601DateFormatter für ISO 8601-Format verwenden.
  • DateTimeFormatter auf Android — threadsicherer Formatierer aus java.time. Ersetzte den veralteten SimpleDateFormat ab API 26.
  • ThreeTenABP — Backport von java.time für Android API unter 26. Fügt LocalDate, ZonedDateTime und DateTimeFormatter auf älteren Geräten hinzu.
  • TimeZone — kritisch für die Konvertierung von UTC in Ortszeit. Zeit in UTC speichern, in der Zeitzone des Benutzers anzeigen.
  • Unix Timestamp — Standardformat für Zeitspeicherung. Synchronisation über NTP garantiert Millisekundengenauigkeit.

Datum und Uhrzeit auf iOS: DateFormatter und ISO8601DateFormatter

Auf iOS werden Datum und Uhrzeit traditionell über DateFormatter aus Foundation formatiert. Diese Klasse konvertiert Date in einen String und zurück unter Verwendung eines angegebenen Musters, Locale und einer Zeitzone. Das Hauptproblem von DateFormatter — es ist nicht threadsicher und wird langsam erstellt, daher müssen Instanzen im mobilen Code unbedingt gecacht werden. Das Datum in der mobilen Entwicklung auf iOS erfordert den richtigen Formatierer.

DateFormatter und Leistung

Das Erstellen eines DateFormatter dauert etwa 1 Millisekunde aufgrund des Parsens des dateFormat-Musters, des Ladens des Locale und der Bestimmung der Zeitzone. Bei der Formatierung einer Liste von Hunderten von Daten führt wiederholtes Erstellen zu spürbaren Verzögerungen in der UI. Die Lösung — den Formatierer einmal für den gesamten Bildschirm erstellen und wiederverwenden. Für den Multithread-Zugriff verwenden Sie die Synchronisation über DispatchQueue.

swift
import Foundation

// Gecachter DateFormatter — wird einmal erstellt
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 — leichte Alternative
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"

Für das ISO 8601-Format verwenden Sie ISO8601DateFormatter — er benötigt kein Muster und arbeitet schneller als DateFormatter. Auf iOS 10+ ist diese Klasse für die Arbeit mit Serverdaten zu bevorzugen. Für alte Formate behalten Sie DateFormatter bei, aber cachen Sie die Instanz unbedingt als statische Eigenschaft oder Singleton.

Datum und Uhrzeit auf Android: java.time und DateTimeFormatter

Auf Android werden Datum und Uhrzeit über das Paket java.time verarbeitet, verfügbar ab API 26. Hauptklassen: LocalDate (nur Datum), LocalTime (nur Zeit), LocalDateTime (Datum und Uhrzeit ohne Zeitzone) und ZonedDateTime (mit Zeitzone). DateTimeFormatter — ein threadsicherer Formatierer für die mobile Plattform Android. Das Datum in mobilen Anwendungen wird über DateTimeFormatter und LocalDate ohne Leistungseinbußen formatiert.

LocalDate, ZonedDateTime und Formatierung

LocalDate speichert Datum ohne Uhrzeit — ideal für Geburtstage. ZonedDateTime speichert vollständige Informationen mit Zeitzone. DateTimeFormatter unterstützt vordefinierte Muster (ISO_LOCAL_DATE, ISO_DATE_TIME) und benutzerdefinierte über ofPattern. Alle java.time-Klassen sind unveränderlich und threadsicher, was Race Conditions bei der Arbeit in mehreren Threads eliminiert.

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

// Aktuelles Datum erstellen und formatieren
val today = LocalDate.now()
val formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy")
val formatted = today.format(formatter)

// Mit Zeitzonen arbeiten
val utcTime = ZonedDateTime.now(ZoneId.of("UTC"))
val moscowTime = utcTime.withZoneSameInstant(ZoneId.of("Europe/Moscow"))

DateTimeFormatter ist deutlich leistungsfähiger als SimpleDateFormat, da er das Muster nicht bei jedem Aufruf parst. Es wird empfohlen, Formatiererkonstanten auf Klassen- oder Companion-Objekt-Ebene zu erstellen. Zur Konvertierung eines Unix Timestamps verwenden Sie Instant.ofEpochSecond und konvertieren Sie dann über die Zeitzone in LocalDateTime oder ZonedDateTime.

Zeitzonen: Datum und Uhrzeit in mobilen Anwendungen und TimeZone

Das korrekte Datum und Uhrzeit auf dem Bildschirm des Benutzers hängt von der richtigen Verarbeitung der Zeitzonen ab. Datum und Uhrzeit in der mobilen Entwicklung für Android erfordert die Berücksichtigung der Zeitzone des Geräts. Die goldene Regel: Speichern Sie die Zeit in UTC, konvertieren Sie nur zur Anzeige in die lokale Zeitzone. iOS stellt TimeZone aus Foundation bereit, Android stellt ZoneId aus java.time bereit. Beide APIs für mobile Plattformen unterstützen die automatische Erkennung der aktuellen Zeitzone des Geräts. Das Datum in einer mobilen Anwendung hängt von ZoneId und TimeZone ab.

Sommerzeit und IANA-Identifikatoren

Die Sommerzeit erzeugt Mehrdeutigkeit: Ein Zeitpunkt kann durch zwei verschiedene lokale Uhrzeiten dargestellt werden. java.time und Foundation behandeln DST automatisch. Verwenden Sie IANA-Identifikatoren (Europe/Moscow, America/New_York), keine Abkürzungen (MSK, EST) — Abkürzungen sind mehrdeutig und ignorieren die Sommerzeitumstellung.

swift
import Foundation

// UTC in lokale Zeit auf iOS konvertieren
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)
}

// Zeitzone des Geräts ermitteln
let localTimeZone = TimeZone.current
let isDST = localTimeZone.isDaylightSavingTime()
let secondsFromGMT = localTimeZone.secondsFromGMT()

Auf Android verwenden Sie ZoneId.systemDefault() um die Zeitzone des Geräts zu erhalten. Bei der Konvertierung von UTC in Ortszeit erstellen Sie eine ZonedDateTime mit ZoneOffset.UTC und wenden withZoneSameInstant an. Für alte APIs ohne java.time verwenden Sie TimeZone.getDefault() und Calendar — aber es ist besser, direkt ThreeTenABP hinzuzufügen.

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

// Unix Timestamp in lokale Zeit konvertieren
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 und Uhrzeit für ältere Android-Versionen

ThreeTenABP — eine Adapter-Bibliothek, die java.time auf Android API unter 26 portiert. Sie stellt dieselben Klassen bereit: LocalDate, LocalTime, ZonedDateTime, DateTimeFormatter, Instant. Wenn die Anwendung Android 5 oder 6 (API 21-25) unterstützt, ist ThreeTenABP der einzige Weg, eine moderne mobile API zu verwenden, ohne auf den veralteten Calendar umsteigen zu müssen. Datum und Uhrzeit in der mobilen Entwicklung für ältere Geräte wird über diese Bibliothek implementiert. Für ältere Geräte werden Datum und Uhrzeit über ThreeTenABP implementiert.

Hinzufügen und Konfigurieren von ThreeTenABP

Die Bibliothek erfordert eine Initialisierung in der Methode Application.onCreate() durch Aufruf von AndroidThreeTen.init(). Dies lädt die Zeitzonendaten aus den assets. Nach der Initialisierung ist die API vollständig identisch mit java.time — der Code für API 26+ und API 21+ wird derselbe sein. Die Bibliotheksgröße beträgt etwa 400 KB, was für die meisten mobilen Anwendungen akzeptabel ist.

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

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

// API ist identisch mit java.time
val today = LocalDate.now()
val formatted = today.format(DateTimeFormatter.ISO_LOCAL_DATE)

Die Leistung von ThreeTenABP ist auf modernen Geräten mit der von original java.time vergleichbar. Auf älteren Geräten kann es beim ersten Aufruf aufgrund des Ladens der Zeitzonendaten zu einer Verzögerung kommen. Migrieren Sie vorhandenen Code schrittweise von Calendar zu ThreeTenABP: Ersetzen Sie Date und Calendar in neuen Modulen durch Instant und LocalDate, lassen Sie alten Code unverändert.

Unix Timestamp und Zeitsynchronisation über NTP

Unix Timestamp — die Anzahl der Sekunden seit dem 1. Januar 1970 00:00 UTC. Dies ist ein universelles Format zum Speichern und Austauschen von Zeit zwischen Server und Client. Die Zeit auf dem Gerät kann jedoch aufgrund von Benutzereinstellungen von der tatsächlichen Zeit abweichen. Zur Synchronisation wird NTP verwendet — ein genaues Zeitprotokoll über UDP. Unix Timestamp ist das Format, in dem Datum und Uhrzeit auf dem Server gespeichert werden.

Unix Timestamp abrufen und NTP-Synchronisation

Date().timeIntervalSince1970 auf iOS gibt Sekunden seit 1970 zurück. Auf Android gibt System.currentTimeMillis() Millisekunden zurück. Verwenden Sie für Genauigkeit NTP: Die TrueTime-Bibliothek für iOS und AndroidNtp für Android senden eine Anfrage an einen NTP-Server und berechnen den Zeitversatz. Die NTP-Genauigkeit beträgt 1-10 ms im lokalen Netzwerk und 10-100 ms über das Internet.

swift
import Foundation

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

// NTP-Synchronisation mit TrueTime
TrueTime.shared.start { result in
    switch result {
    case .success:
        let ntpTime = TrueTime.shared.now()
        print("Genaue Zeit: \(ntpTime)")
    case .failure(let error):
        print("NTP-Fehler: \(error)")
    }
}

Ohne Synchronisation in einer mobilen Anwendung sind Fehler möglich: falsche Zeitstempel von Ereignissen, Desynchronisation mit dem Server. Die Zeit in der mobilen Entwicklung wird einmal beim Start der Anwendung über NTP synchronisiert, danach wird der berechnete Versatz verwendet. Für zeitkritische mobile Anwendungen (Finanzen, Logistik) ist das NTP-Protokoll vor dem Senden von Daten an den Server obligatorisch.

Häufig gestellte Fragen

Warum ist DateFormatter auf iOS langsam?

DateFormatter parst das Formatierungsmuster, lädt das Locale und bestimmt die Zeitzone bei jeder Instanzerstellung. Cachen Sie den Formatierer als statische Konstante oder verwenden Sie ISO8601DateFormatter für ISO 8601 — er ist leichter und schneller.

Was soll man anstelle von SimpleDateFormat auf Android verwenden?

DateTimeFormatter aus dem Paket java.time — threadsicher und leistungsstark. Verfügbar ab API 26. Für ältere Versionen verwenden Sie ThreeTenABP, das eine identische API bereitstellt.

Wie arbeitet man mit Daten vor Java 8 auf Android?

Fügen Sie ThreeTenABP hinzu — einen Backport von java.time für Android API 21+. Initialisierung über AndroidThreeTen.init() in Application.onCreate(). Die API ist vollständig identisch mit original java.time.

Muss man die Zeit in UTC speichern?

Ja, speichern Sie die Zeit in UTC auf dem Server und in der lokalen Datenbank. Konvertieren Sie nur in der Anzeigephase in die lokale Zeitzone des Benutzers. Dadurch werden Fehler bei Zeitzonenwechsel oder Reisen ausgeschlossen.

Wie erhält man den Unix Timestamp auf iOS?

Date().timeIntervalSince1970 gibt die Anzahl der Sekunden seit dem 1. Januar 1970 zurück. Für Millisekunden multiplizieren Sie mit 1000 und konvertieren Sie in Int64. Für genaue Synchronisation verwenden Sie die TrueTime-Bibliothek mit einem NTP-Server.

Zusammenfassung

  • DateFormatter auf iOS — das wichtigste Werkzeug zur Formatierung von Datum und Uhrzeit, erfordert obligatorisches Caching von Instanzen. ISO8601DateFormatter ist eine leichtere Alternative für ISO 8601.
  • DateTimeFormatter auf Android — threadsicherer Formatierer aus java.time für API 26+. LocalDate und ZonedDateTime sind die Hauptklassen für die Arbeit mit Daten.
  • ThreeTenABP — eine einheitliche API für alle Android-Versionen. Für Abwärtskompatibilität mit API 21-25 hinzufügen. Der Code unterscheidet sich nicht von java.time.
  • TimeZone und UTC — Zeit in UTC speichern, nur zur Anzeige in lokale Zeitzone konvertieren. IANA-Identifikatoren verwenden.
  • Unix Timestamp — universelles Format für den Zeitaustausch zwischen Server und Client. Auf iOS über Date().timeIntervalSince1970 abrufen.
  • NTP-Synchronisation — gewährleistet Zeitgenauigkeit bis auf Millisekunden. TrueTime (iOS) und AndroidNtp (Android) sind die Standardbibliotheken.

Wir entwickeln eine mobile Applikation schlüsselfertig

IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.

Projekt besprechen