Datum och tid i mobilutveckling: vad det är, vilka format och hur man arbetar

Författare: IT Sectr Publicerad: 2026-07-22 Lästid: 11 min

Datum och tid i mobilutveckling — ett av de centrala ämnena inom mobil ingenjörskonst. iOS använder DateFormatter och ISO8601DateFormatter, Android använder DateTimeFormatter och LocalDate från java.time. Enligt Android Developer Docs påverkar valet av mobilt API för datum- och tidsformatering direkt prestanda och korrekt visning i olika tidszoner.

Huvudpunkter

  • DateFormatter på iOS — kraftfull men långsam vid frekvent skapande. Cachelagra instanser eller använd ISO8601DateFormatter för ISO 8601-format.
  • DateTimeFormatter på Android — trådsäker formaterare från java.time. Ersatte den föråldrade SimpleDateFormat från API 26.
  • ThreeTenABP — backport av java.time för Android API under 26. Lägger till LocalDate, ZonedDateTime och DateTimeFormatter på äldre enheter.
  • TimeZone — kritisk för konvertering från UTC till lokal tid. Lagra tid i UTC, visa i användarens tidszon.
  • Unix Timestamp — standardformat för tidslagring. Synkronisering via NTP garanterar millisekundprecision.

Datum och tid på iOS: DateFormatter och ISO8601DateFormatter

På iOS formateras datum och tid traditionellt via DateFormatter från Foundation. Denna klass konverterar Date till sträng och tillbaka med hjälp av ett angivet mönster, locale och tidszon. Huvudproblemet med DateFormatter — den är inte trådsäker och skapas långsamt, därför måste instanser cachas i mobil kod. Datum i mobilutveckling på iOS kräver rätt formaterare.

DateFormatter och prestanda

Att skapa en DateFormatter tar cirka 1 millisekund på grund av parsning av dateFormat-mönster, laddning av locale och bestämning av tidszon. Vid formatering av en lista med hundratals datum leder upprepad skapelse till märkbar fördröjning i UI. Lösning — skapa formateraren en gång för hela skärmen och återanvänd. För flertrådad åtkomst, använd synkronisering via DispatchQueue.

swift
import Foundation

// Cachelagrad DateFormatter — skapas en gång
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 — lättviktigt alternativ
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 ISO 8601-format, använd ISO8601DateFormatter — den kräver inget mönster och arbetar snabbare än DateFormatter. På iOS 10+ är denna klass att föredra för arbete med serverdatum. För gamla format, behåll DateFormatter men cachelagra instansen som en statisk egenskap eller singleton.

Datum och tid på Android: java.time och DateTimeFormatter

På Android hanteras datum och tid via paketet java.time, tillgängligt från API 26. Huvudklasser: LocalDate (endast datum), LocalTime (endast tid), LocalDateTime (datum och tid utan tidszon) och ZonedDateTime (med tidszon). DateTimeFormatter — trådsäker formaterare för mobilplattformen Android. Datum i mobilapplikationer formateras via DateTimeFormatter och LocalDate utan prestandaförlust.

LocalDate, ZonedDateTime och formatering

LocalDate lagrar datum utan tid — idealiskt för födelsedagar. ZonedDateTime lagrar fullständig information med tidszon. DateTimeFormatter stöder fördefinierade mönster (ISO_LOCAL_DATE, ISO_DATE_TIME) och anpassade via ofPattern. Alla java.time-klasser är oföränderliga och trådsäkra, vilket eliminerar race conditions vid arbete i flera trådar.

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

// Skapa och formatera aktuellt datum
val today = LocalDate.now()
val formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy")
val formatted = today.format(formatter)

// Arbeta med tidszoner
val utcTime = ZonedDateTime.now(ZoneId.of("UTC"))
val moscowTime = utcTime.withZoneSameInstant(ZoneId.of("Europe/Moscow"))

DateTimeFormatter är betydligt prestandastarkare än SimpleDateFormat eftersom den inte parsar mönstret vid varje anrop. Rekommenderas att skapa formaterarkonstanter på klass- eller kompanjonsobjektnivå. För konvertering av Unix Timestamp, använd Instant.ofEpochSecond, konvertera sedan till LocalDateTime eller ZonedDateTime via tidszon.

Tidszoner: datum och tid i mobilapplikationer och TimeZone

Korrekt datum och tid på användarens skärm beror på korrekt hantering av tidszoner. Datum och tid i mobilutveckling för Android kräver hänsyn till enhetens tidszon. Gyllene regeln: lagra tid i UTC, konvertera till lokal tidszon endast för visning. iOS tillhandahåller TimeZone från Foundation, Android — ZoneId från java.time. Båda API:erna för mobilplattformar stöder automatisk identifiering av enhetens aktuella tidszon. Datum i mobilapplikationen beror på ZoneId och TimeZone.

Sommartid och IANA-identifierare

Sommartid skapar tvetydighet: en tidpunkt kan representeras av två olika lokala klockor. java.time och Foundation hanterar DST automatiskt. Använd IANA-identifierare (Europe/Moscow, America/New_York), inte förkortningar (MSK, EST) — förkortningar är tvetydiga och ignorerar sommartidsomställning.

swift
import Foundation

// Konvertering UTC till lokal tid på 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)
}

// Bestämning av enhetens tidszon
let localTimeZone = TimeZone.current
let isDST = localTimeZone.isDaylightSavingTime()
let secondsFromGMT = localTimeZone.secondsFromGMT()

Android, använd ZoneId.systemDefault() för att få enhetens tidszon. Vid konvertering från UTC till lokal tid, skapa ZonedDateTime med ZoneOffset.UTC och tillämpa withZoneSameInstant. För gamla API:er utan java.time, använd TimeZone.getDefault() och Calendar — men det är bättre att direkt ansluta ThreeTenABP.

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

// Konvertera Unix Timestamp till lokal tid
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 och tid för äldre Android-versioner

ThreeTenABP — ett adapterbibliotek som porterar java.time till Android API under 26. Det tillhandahåller samma klasser: LocalDate, LocalTime, ZonedDateTime, DateTimeFormatter, Instant. Om applikationen stöder Android 5 eller 6 (API 21-25) är ThreeTenABP det enda sättet att använda modernt mobilt API utan att gå över till föråldrade Calendar. Datum och tid i mobilutveckling för äldre enheter implementeras via detta bibliotek. För äldre enheter implementeras datum och tid via ThreeTenABP.

Anslutning och konfiguration av ThreeTenABP

Biblioteket kräver initiering i metoden Application.onCreate() med anrop till AndroidThreeTen.init(). Detta laddar tidszonsdata från assets. Efter initiering är API helt identiskt med java.time — koden för API 26+ och API 21+ kommer att vara densamma. Bibliotekets storlek är cirka 400 KB, vilket är acceptabelt för de flesta mobilapplikationer.

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

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

// API är identiskt med java.time
val today = LocalDate.now()
val formatted = today.format(DateTimeFormatter.ISO_LOCAL_DATE)

Prestandan för ThreeTenABP är jämförbar med original java.time på moderna enheter. På äldre enheter kan det bli fördröjning vid första anropet på grund av laddning av tidszonsdata. Migrera befintlig kod från Calendar till ThreeTenABP gradvis: ersätt Date och Calendar med Instant och LocalDate i nya moduler, lämna gammal kod oförändrad.

Unix Timestamp och tidssynkronisering via NTP

Unix Timestamp — antalet sekunder som gått sedan 1 januari 1970 00:00 UTC. Det är ett universellt format för lagring och utbyte av tid mellan server och klient. Tiden på enheten kan dock skilja sig från verklig tid på grund av användarinställningar. För synkronisering används NTP — ett protokoll för exakt tid via UDP. Unix Timestamp är formatet i vilket datum och tid lagras på servern.

Hämta Unix Timestamp och NTP-synkronisering

Date().timeIntervalSince1970 på iOS returnerar sekunder sedan 1970. På Android returnerar System.currentTimeMillis() millisekunder. För precision, använd NTP: TrueTime-biblioteket för iOS och AndroidNtp för Android skickar en förfrågan till NTP-servern och beräknar tidsförskjutningen. NTP-precision är 1-10 ms i lokalt nätverk och 10-100 ms över internet.

swift
import Foundation

// Hämta Unix Timestamp på iOS
let seconds = Date().timeIntervalSince1970
let milliseconds = Int64(seconds * 1000)

// NTP-synkronisering med TrueTime
TrueTime.shared.start { result in
    switch result {
    case .success:
        let ntpTime = TrueTime.shared.now()
        print("Exakt tid: \(ntpTime)")
    case .failure(let error):
        print("NTP-fel: \(error)")
    }
}

Utan synkronisering i mobilapplikationen kan fel uppstå: felaktig markering av händelser, desynkronisering med servern. Tid i mobilutveckling synkroniseras via NTP en gång vid applikationsstart, därefter används den beräknade förskjutningen. För tidskritiska mobilapplikationer (finans, logistik) är NTP-protokollet obligatoriskt innan data skickas till servern.

Vanliga frågor

Varför är DateFormatter långsam på iOS?

DateFormatter parsar formateringsmönstret, laddar locale och bestämmer tidszon vid varje skapande av instans. Cachelagra formateraren som en statisk konstant eller använd ISO8601DateFormatter för ISO 8601 — den är lättare och snabbare.

Vad ska man använda istället för SimpleDateFormat på Android?

DateTimeFormatter från paketet java.time — trådsäker och prestandastark. Tillgänglig från API 26. För äldre versioner, använd ThreeTenABP som tillhandahåller identiskt API.

Hur arbetar man med datum före Java 8 på Android?

Anslut ThreeTenABP — backport av java.time för Android API 21+. Initiering via AndroidThreeTen.init() i Application.onCreate(). API är helt identiskt med original java.time.

Måste man lagra tid i UTC?

Ja, lagra tid i UTC på servern och i lokal databas. Konvertera till användarens lokala tidszon endast vid visning. Detta eliminerar fel vid tidszonsändring eller resor.

Hur får man Unix Timestamp på iOS?

Date().timeIntervalSince1970 returnerar antalet sekunder sedan 1 januari 1970. För millisekunder, multiplicera med 1000 och konvertera till Int64. För exakt synkronisering, använd TrueTime-biblioteket med NTP-server.

Sammanfattning

  • DateFormatter på iOS — huvudverktyg för formatering av datum och tid, kräver obligatorisk cachelagring av instanser. ISO8601DateFormatter är ett lättare alternativ för ISO 8601.
  • DateTimeFormatter på Android — trådsäker formaterare från java.time för API 26+. LocalDate och ZonedDateTime är huvudklasser för datumhantering.
  • ThreeTenABP — enhetligt API för alla Android-versioner. Anslut för bakåtkompatibilitet med API 21-25. Koden skiljer sig inte från java.time.
  • TimeZone och UTC — lagra tid i UTC, konvertera till lokal tidszon endast för visning. Använd IANA-identifierare.
  • Unix Timestamp — universellt format för tidsutbyte mellan server och klient. Hämta via Date().timeIntervalSince1970 på iOS.
  • NTP-synkronisering — säkerställer millisekundprecision. TrueTime (iOS) och AndroidNtp (Android) är standardbibliotek.

Vi utvecklar en mobil applikation nyckelfärdigt

IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.

Diskutera projektet