DateIntervalFormatter är en klass i Foundation i iOS och macOS som är utformad för att formatera datumintervall till lokaliserade strängar: "21–25 juli 2024", "från 21 till 25 juli 2024" eller "Jul 21–25, 2024". Enligt Apple Developer Documentation, 2024, bestämmer DateIntervalFormatter automatiskt vilka datumkomponenter som ska upprepas (om intervallet ligger inom en månad — visas månaden en gång) och lokaliserar avgränsare och ordföljd. Till skillnad från manuell sammanfogning av två formaterade datum tar denna klass hänsyn till språkets grammatiska regler: för svenska — prepositionen "till", för engelska — bindestreck utan preposition. Klassen är tillgänglig från iOS 8 och macOS 10.10.
Huvudpunkter
DateIntervalFormatter är en underklass till Formatter i Foundation som tar emot ett DateInterval-objekt (ett intervall mellan två datum) och returnerar en lokaliserad sträng med en beskrivning av detta intervall. Till exempel, för intervallet 21–25 juli 2024 blir resultatet "21–25 juli 2024" för sv_SE och "Jul 21–25, 2024" för en_US. Klassen grupperar intelligent upprepade element: om båda datumen är inom samma månad visas månadsnamnet en gång.
Huvudvärdet med DateIntervalFormatter är automatisk bearbetning av intervallgrammatik. Vid manuell formatering måste utvecklaren jämföra månad/år för början och slut, välja avgränsare (bindestreck, "från–till", "to", "bis") och övervaka böjning. DateIntervalFormatter gör detta automatiskt baserat på CLDR-data (Common Locale Data Repository), vilket minskar antalet buggar i internationella applikationer, särskilt för språk med komplex grammatik.
Enligt Unicode CLDR v44 (2024) skiljer sig reglerna för formatering av datumintervall avsevärt mellan språk. Tyska använder prepositionen "bis" (21.–25. Juli 2024), franska — "au" (du 21 au 25 juillet 2024), japanska — med bindestreck (2024 Jul 21–25). DateIntervalFormatter täcker alla dessa variationer utan extra kod från utvecklaren.
Funktionsprincip DateIntervalFormatter bygger på analys av två datum som bildar intervallet och val av optimal textrepresentation med hänsyn till locale. Klassen jämför datumkomponenter (år, månad, dag) och beslutar om gruppering: om året är detsamma — visas det en gång; om månaden är densamma — visas den en gång; om dagarna skiljer sig — visas dagintervallet.
| Intervall | sv_SE | en_US |
|---|---|---|
| En dag | 21 juli 2024 | Jul 21, 2024 |
| Inom en månad | 21–25 juli 2024 | Jul 21–25, 2024 |
| Olika månader | 21 juli – 5 augusti 2024 | Jul 21 – Aug 5, 2024 |
| Olika år | 25 december 2024 – 5 januari 2025 | Dec 25, 2024 – Jan 5, 2025 |
| Med tid | 21 juli 2024, 14:30–16:45 | Jul 21, 2024, 2:30–4:45 PM |
Grupperingslogik är implementerad baserat på CLDR-mallar. Formateraren kontrollerar likheten för varje datumkomponent (Calendar.Component: year, month, day) i ordning från störst till minst. Så snart en komponent skiljer sig visas alla mindre komponenter för båda datumen. Till exempel, för 21–25 juli: året stämmer, månaden stämmer, dagen skiljer sig → månad en gång, dagar — för varje datum separat.
Viktig nyans: DateIntervalFormatter stöder inte konfiguration av avgränsare via API. Avgränsaren bestäms av locale och kan inte åsidosättas. Om en anpassad avgränsare behövs (till exempel "till" istället för "–"), måste du formatera datumen manuellt via DateFormatter och sammanfoga strängarna med en anpassad avgränsare.
DateIntervalFormatter erbjuder två uppsättningar stilar: dateStyle och timeStyle — för varje ände av intervallet. Dessa stilar fungerar liknande DateFormatter: .none döljer komponenten, .short ger kort format (21.07.2024), .medium — medel (21 jul 2024), .long — långt (21 juli 2024), .full — maximalt detaljerad (söndag, 21 juli 2024). Genom att kombinera dateStyle och timeStyle kan olika detaljnivåer uppnås.
Viktigt: dateStyle och timeStyle tillämpas lika på båda ändarna av intervallet. Det går inte att ställa in olika stil för början och slut (till exempel .medium för början och .short för slut). Om olika stil behövs måste du formatera varje datum med en separat DateFormatter och sammanfoga resultaten.
import Foundation
let formatter = DateIntervalFormatter()
// Olika stilombinationer
let startDate = Date()
let endDate = Date().addingTimeInterval(345600) // +4 dagar
let interval = DateInterval(start: startDate, end: endDate)
// Endast datum, medium format
formatter.dateStyle = .medium
formatter.timeStyle = .none
print("Endast datum: \(formatter.string(from: interval))")
// Kort format med tid
formatter.dateStyle = .short
formatter.timeStyle = .short
print("Kort med tid: \(formatter.string(from: interval))")
// Fullständigt format
formatter.dateStyle = .full
formatter.timeStyle = .none
print("Fullständigt datum: \(formatter.string(from: interval))")
Grundläggande användning av DateIntervalFormatter inkluderar att skapa en instans, konfigurera stilar och anropa string(from:). Metoden accepterar DateInterval — en struktur med egenskaperna start och end. DateInterval kan skapas från två Date, eller initieras med Duration (iOS 16+). Efter formatering är resultatet redo att visas i UI utan ytterligare bearbetning.
import Foundation
let calendar = Calendar.current
let now = Date()
// Specifika intervall exempel
let examples: [(title: String, start: Date, end: Date)] = [
(
"2-hour event",
now,
now.addingTimeInterval(7200)
),
(
"Week-long vacation",
now,
now.addingTimeInterval(604800)
),
(
"Cross-year period",
calendar.date(from: DateComponents(
year: 2024, month: 12, day: 25
))!,
calendar.date(from: DateComponents(
year: 2025, month: 1, day: 5
))!
)
]
let intervalFormatter = DateIntervalFormatter()
intervalFormatter.dateStyle = .medium
intervalFormatter.timeStyle = .short
for (title, start, end) in examples {
let interval = DateInterval(start: start, end: end)
let result = intervalFormatter.string(from: interval)
print("\(title): \(result)")
}
// Formatering via Calendar (iOS 16+)
if let nextWeek = calendar.date(
byAdding: .day, value: 7, to: now
) {
let weekInterval = DateInterval(start: now, end: nextWeek)
print("Nästa 7 dagar: \(intervalFormatter.string(from: weekInterval))")
}
DateIntervalFormatter och Calendar Booking: i bokningsapplikationer (hotell, biljetter) är datumintervall en nyckeldel av UI. DateIntervalFormatter hanterar korrekt intervall som sträcker sig över årsskiften (till exempel från 28 december till 3 januari), genom att gruppera månad och år för varje datum separat. För sådana scenarier rekommenderas att använda dateStyle = .medium och timeStyle = .none — det mest läsliga formatet för datum utan tid.
import Foundation
let formatter = DateIntervalFormatter()
formatter.dateStyle = .long
formatter.timeStyle = .none
// Bokningsexempel
struct Booking {
let checkIn: Date
let checkOut: Date
var formattedInterval: String {
let interval = DateInterval(start: checkIn, end: checkOut)
return formatter.string(from: interval)
}
}
let booking = Booking(
checkIn: calendar.date(from: DateComponents(
year: 2024, month: 7, day: 21
))!,
checkOut: calendar.date(from: DateComponents(
year: 2024, month: 7, day: 25
))!
)
print("Bokning: \(booking.formattedInterval)")
// Användning med olika locale
let enFormatter = DateIntervalFormatter()
enFormatter.dateStyle = .medium
enFormatter.timeStyle = .none
enFormatter.locale = Locale(identifier: "en_US")
print("Engelska: \(enFormatter.string(from: interval))")
DateInterval vs DateIntervalFormatter: DateInterval — en struktur som representerar ett datumintervall (början och slut). DateIntervalFormatter — en formaterare som omvandlar denna struktur till en sträng. DateInterval stöder även contains(Date)- och intersection(with:)-kontroller, vilket är användbart för bokningslogik (kontroll av överlappande datum).
DateIntervalFormatter lokaliserar utdata via egenskapen locale. Som standard används Locale.current — enhetens locale. För att visa intervall på ett annat språk (till exempel engelskt innehåll i svenskt gränssnitt), ställ in locale explicit. Till skillnad från DateFormatter kräver DateIntervalFormatter ingen Locale-inställning för serverdata — den använder alltid sin egen interna grupperingslogik baserad på CLDR.
Språkskillnader i formatering av datumintervall är betydligt mer komplexa än för enskilda datum. Engelska använder enkelt bindestreck: Jul 21–25. Svenska — prepositionen "från–till": från 21 till 25 juli. Franska — "au": du 21 au 25 juillet. Tyska — punkt efter siffra och bindestreck: 21.–25. Juli. Japanska — med bindestreck utan preposition: Jul 21–25. DateIntervalFormatter täcker alla dessa varianter.
import Foundation
let formatter = DateIntervalFormatter()
formatter.dateStyle = .medium
formatter.timeStyle = .none
let start = Date()
let end = Date().addingTimeInterval(259200) // +3 dagar
let interval = DateInterval(start: start, end: end)
// Demonstration av olika locale
let localeIds = ["ru_RU", "en_US", "de_DE", "fr_FR", "ja_JP", "zh_CN"]
for localeId in localeIds {
formatter.locale = Locale(identifier: localeId)
print("\(localeId): \(formatter.string(from: interval))")
}
// Lokalisering för tidsintervall
formatter.dateStyle = .none
formatter.timeStyle = .short
let todayStart = Date()
let todayEnd = Date().addingTimeInterval(3600)
let timeInterval = DateInterval(start: todayStart, end: todayEnd)
for localeId in ["ru_RU", "en_US", "de_DE"] {
formatter.locale = Locale(identifier: localeId)
print("\(localeId) tid: \(formatter.string(from: timeInterval))")
}
Lokaliseringsfunktioner: för svenska använder DateIntervalFormatter prepositionerna "från" och "till" för långa datumformat. För kort (short) format — endast bindestreck: 21.07–25.07.2024. För fullständigt format (full) — med angivelse av veckodag. Valet av format beror på sammanhanget: för bokningslista använd .medium, för detaljerad visning — .long eller .full.
DateIntervalFormatter fyller nischen för formatering av datumintervall som andra Foundation-klasser inte täcker. DateFormatter formaterar enskilda datum, RelativeDateTimeFormatter — relativa datum (sedan/om), DateComponentsFormatter — varaktighet (2 timmar 30 minuter). Var och en av dessa klasser löser sin egen uppgift och kan inte ersättas av varandra.
| Klass | Syfte | Exempel på utdata |
|---|---|---|
| DateIntervalFormatter | Datumintervall | 21–25 juli 2024 |
| DateFormatter | Enskilt datum | 21 juli 2024 |
| RelativeDateTimeFormatter | Relativ tid | 3 dagar sedan |
| DateComponentsFormatter | Varaktighet | 2 timmar 30 minuter |
| ISO8601DateFormatter | ISO 8601 format | 2024-07-21T14:30:00Z |
När ska DateIntervalFormatter användas: för att visa datumintervall i UI — hotellbokning, evenemang, filtrering efter datum, operationshistorik. För att beräkna varaktigheten mellan datum, använd DateComponentsFormatter, inte DateIntervalFormatter — den senare är inte avsedd för att visa varaktighet. DateFormatter bör endast användas för enskilda datum, inte för att sammanfoga två formaterade datum via strängkonkatenering — detta leder till förlorad lokalisering av avgränsaren.
Kantfall: DateIntervalFormatter stöder inte visning av öppna intervall (utan slutdatum). Om intervallets slut är okänt (till exempel "från 21 juli"), använd DateFormatter med prepositionen "från" för svenska eller "from" för engelska. DateIntervalFormatter stöder inte heller intervall med tidsangivelse för olika dagar — tid tillämpas på varje datum separat, vilket kan verka överflödigt för korta intervall.
Vanliga frågor
DateIntervalFormatter — Foundation-klass för formatering av datumintervall till lokaliserade strängar. Tillgänglig från iOS 8, grupperar automatiskt upprepade komponenter (månad, år) och väljer rätt avgränsare för språket.
Jämför komponenter från år till dag. Om året stämmer — visas det en gång. Om månaden stämmer — visas den en gång. Olika dagar visas som intervall. Detta ger "21–25 juli 2024" istället för "21 juli 2024 – 25 juli 2024".
Nej, avgränsaren bestäms av locale och kan inte konfigureras via API. För en anpassad avgränsare (till exempel "till" istället för "–"), formatera varje datum med en separat DateFormatter och sammanfoga strängarna manuellt.
DateIntervalFormatter formaterar ett datumintervall (två datum) som en helhet med gruppering av komponenter. DateFormatter formaterar ett enskilt datum. För intervall, använd alltid DateIntervalFormatter — detta säkerställer korrekt lokalisering av avgränsaren.
Automatiskt — DateIntervalFormatter upptäcker att åren är olika och visar fullständiga datum för båda ändarna: "25 december 2024 – 5 januari 2025". Inga ytterligare inställningar behövs, det räcker att ställa in dateStyle.
Sammanfattning
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.
Läs också