DateIntervalFormatter — basis, opmaak van datumsintervallen

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

DateIntervalFormatter is een Foundation-klasse in iOS en macOS voor het formatteren van datumbereiken naar gelokaliseerde strings: „21–25 juli 2024“, „van 21 tot 25 juli 2024“ of „Jul 21–25, 2024“. Volgens Apple Developer Documentation, 2024, bepaalt DateIntervalFormatter automatisch welke datumcomponenten herhaald moeten worden (als het bereik binnen een maand valt — wordt de maand eenmaal weergegeven) en lokaliseert scheidingstekens en woordvolgorde. In tegenstelling tot het handmatig samenvoegen van twee opgemaakte datums, houdt deze klasse rekening met grammaticale regels van de taal: voor Nederlands — voorzetsel „tot“, voor Engels — koppelteken zonder voorzetsel. De klasse is beschikbaar vanaf iOS 8 en macOS 10.10.

Belangrijkste punten

  • DateIntervalFormatter — Foundation-klasse voor het formatteren van datumbereiken (iOS 8+)
  • Automatisch groeperen — herhaalde componenten (maand, jaar) worden eenmaal weergegeven
  • Gelokaliseerde scheidingstekens — rekening houden met grammaticale regels: „van–tot“ (Nederlands), koppelteken (Engels)
  • Drie datumsstijlen — .none, .short, .medium, .long, .full voor elk uiteinde van het bereik
  • Vier tijdstijlen — dezelfde detailniveaus voor het tijdsgedeelte van het bereik

Wat is DateIntervalFormatter?

DateIntervalFormatter is een subclass van Formatter in Foundation die een DateInterval-object (een bereik tussen twee datums) ontvangt en een gelokaliseerde string retourneert met een beschrijving van dit bereik. Bijvoorbeeld, voor het bereik van 21 tot 25 juli 2024 is het resultaat „21–25 juli 2024“ voor nl_NL en „Jul 21–25, 2024“ voor en_US. De klasse groepeert herhalende elementen intelligent: als beide datums in dezelfde maand vallen, wordt de maandnaam eenmaal weergegeven.

De belangrijkste waarde van DateIntervalFormatter is de automatische verwerking van bereikgrammatica. Bij handmatige opmaak zou de ontwikkelaar de maand/het jaar van begin en einde moeten vergelijken, een scheidingsteken moeten kiezen (koppelteken, „van–tot“, „to“, „bis“) en de verbuiging moeten controleren. DateIntervalFormatter doet dit automatisch op basis van CLDR-gegevens (Common Locale Data Repository), wat het aantal bugs in internationale applicaties vermindert, vooral voor talen met complexe grammatica.

Volgens Unicode CLDR v44 (2024) verschillen de regels voor het formatteren van datumbereiken aanzienlijk tussen talen. Duits gebruikt het voorzetsel „bis“ (21.–25. Juli 2024), Frans — „au“ (du 21 au 25 juillet 2024), Japans — via koppelteken (2024 Jul 21–25). DateIntervalFormatter dekt al deze variaties zonder extra code van de ontwikkelaar.

Hoe werkt DateIntervalFormatter in Foundation?

Werkingsprincipe van DateIntervalFormatter is gebaseerd op analyse van twee datums die het bereik vormen en selectie van de optimale tekstweergave rekening houdend met locale. De klasse vergelijkt datumcomponenten (jaar, maand, dag) en beslist over groepering: als het jaar hetzelfde is — wordt het eenmaal weergegeven; als de maand hetzelfde is — wordt deze eenmaal weergegeven; als de dagen verschillen — wordt het dagenbereik weergegeven.

Bereiknl_NLen_US
Eén dag21 juli 2024Jul 21, 2024
Binnen een maand21–25 juli 2024Jul 21–25, 2024
Verschillende maanden21 juli – 5 augustus 2024Jul 21 – Aug 5, 2024
Verschillende jaren25 december 2024 – 5 januari 2025Dec 25, 2024 – Jan 5, 2025
Met tijd21 juli 2024, 14:30–16:45Jul 21, 2024, 2:30–4:45 PM

Groepeerlogica is geïmplementeerd op basis van CLDR-sjablonen. De formatter controleert de gelijkheid van elke datumcomponent (Calendar.Component: year, month, day) in volgorde van groot naar klein. Zodra een component verschilt, worden alle kleinere componenten voor beide datums weergegeven. Bijvoorbeeld, voor 21–25 juli: jaar komt overeen, maand komt overeen, dag verschilt → maand eenmaal, dagen — voor elke datum afzonderlijk.

Belangrijke nuance: DateIntervalFormatter ondersteunt geen configuratie van het scheidingsteken via API. Het scheidingsteken wordt bepaald door locale en kan niet worden overschreven. Als een aangepast scheidingsteken nodig is (bijvoorbeeld „tot en met“ in plaats van „–“), moet u datums handmatig formatteren via DateFormatter en strings samenvoegen met een aangepast scheidingsteken.

Stijlen voor intervalopmaak

DateIntervalFormatter biedt twee sets stijlen: dateStyle en timeStyle — voor elk uiteinde van het bereik. Deze stijlen werken vergelijkbaar met DateFormatter: .none verbergt de component, .short geeft een korte notatie (21.07.2024), .medium — gemiddeld (21 jul 2024), .long — uitgebreid (21 juli 2024), .full — maximaal gedetailleerd (zondag, 21 juli 2024). Door dateStyle en timeStyle te combineren, kunnen verschillende detailniveaus worden verkregen.

Voorbeelden van stijlcombinaties

  • dateStyle = .medium, timeStyle = .none — alleen datum: „21–25 juli 2024“
  • dateStyle = .short, timeStyle = .short — datum en tijd: „21.07.2024, 14:30 – 25.07.2024, 16:45“
  • dateStyle = .none, timeStyle = .short — alleen tijd: „14:30–16:45“ (als datums hetzelfde zijn)
  • dateStyle = .long, timeStyle = .none — lange datum: „21–25 juli 2024“
  • dateStyle = .full, timeStyle = .short — volledige notatie: „zondag, 21 juli 2024 – donderdag, 25 juli 2024“

Belangrijk: dateStyle en timeStyle worden gelijkelijk toegepast op beide uiteinden van het bereik. Het is niet mogelijk een andere stijl in te stellen voor begin en einde (bijvoorbeeld .medium voor begin en .short voor einde). Als een andere stijl nodig is, moet u elke datum met een afzonderlijke DateFormatter formatteren en de resultaten samenvoegen.

swift
import Foundation

let formatter = DateIntervalFormatter()

// Verschillende stijlcombinaties
let startDate = Date()
let endDate = Date().addingTimeInterval(345600) // +4 dagen
let interval = DateInterval(start: startDate, end: endDate)

// Alleen datum, medium notatie
formatter.dateStyle = .medium
formatter.timeStyle = .none
print("Alleen datum: \(formatter.string(from: interval))")

// Korte notatie met tijd
formatter.dateStyle = .short
formatter.timeStyle = .short
print("Kort met tijd: \(formatter.string(from: interval))")

// Volledige notatie
formatter.dateStyle = .full
formatter.timeStyle = .none
print("Volledige datum: \(formatter.string(from: interval))")

DateIntervalFormatter in Swift: voorbeelden

Basisgebruik van DateIntervalFormatter omvat het maken van een instantie, het configureren van stijlen en het aanroepen van string(from:). De methode accepteert DateInterval — een structuur met start- en end-eigenschappen. DateInterval kan worden gemaakt van twee Date-objecten, maar ook worden geïnitialiseerd met Duration (iOS 16+). Na formattering is het resultaat klaar voor weergave in de UI zonder verdere verwerking.

swift
import Foundation

let calendar = Calendar.current
let now = Date()

// Specifieke intervalvoorbeelden
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)")
}

// Formatteren via Calendar (iOS 16+)
if let nextWeek = calendar.date(
    byAdding: .day, value: 7, to: now
) {
    let weekInterval = DateInterval(start: now, end: nextWeek)
    print("Volgende 7 dagen: \(intervalFormatter.string(from: weekInterval))")
}

DateIntervalFormatter en Calendar Booking: in boekingsapplicaties (hotels, tickets) zijn datumbereiken een belangrijk UI-element. DateIntervalFormatter verwerkt jaargrensoverschrijdende bereiken correct (bijvoorbeeld van 28 december tot 3 januari), door maand en jaar voor elke datum afzonderlijk te groeperen. Voor dergelijke scenario’s wordt aanbevolen dateStyle = .medium en timeStyle = .none te gebruiken — de meest leesbare notatie voor datums zonder tijd.

swift
import Foundation

let formatter = DateIntervalFormatter()
formatter.dateStyle = .long
formatter.timeStyle = .none

// Boekingsvoorbeelden
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("Boeking: \(booking.formattedInterval)")

// Gebruik met verschillende locales
let enFormatter = DateIntervalFormatter()
enFormatter.dateStyle = .medium
enFormatter.timeStyle = .none
enFormatter.locale = Locale(identifier: "en_US")
print("Engels: \(enFormatter.string(from: interval))")

DateInterval vs DateIntervalFormatter: DateInterval — een structuur die een datumbereik vertegenwoordigt (begin en einde). DateIntervalFormatter — een formatter die deze structuur omzet in een string. DateInterval ondersteunt ook contains(Date)- en intersection(with:)-controles, wat nuttig is voor boekingslogica (controleren op overlapping van datums).

Lokalisatie van datumsintervallen

DateIntervalFormatter lokaliseert uitvoer via de eigenschap locale. Standaard wordt Locale.current gebruikt — de locale van het apparaat. Om intervallen in een andere taal weer te geven (bijvoorbeeld Engelse inhoud in een Nederlandse interface), stelt u expliciet een locale in. In tegenstelling tot DateFormatter vereist DateIntervalFormatter geen Locale-instelling voor servergegevens — het gebruikt altijd zijn eigen interne groeperingslogica op basis van CLDR.

Taalverschillen in het formatteren van datumbereiken zijn aanzienlijk complexer dan voor afzonderlijke datums. Engels gebruikt een eenvoudig koppelteken: Jul 21–25. Nederlands — het voorzetsel „van–tot“: van 21 tot 25 juli. Frans — het voorzetsel „au“: du 21 au 25 juillet. Duits — punt na het cijfer en koppelteken: 21.–25. Juli. Japans — via koppelteken zonder voorzetsel: Jul 21–25. DateIntervalFormatter dekt al deze varianten.

swift
import Foundation

let formatter = DateIntervalFormatter()
formatter.dateStyle = .medium
formatter.timeStyle = .none

let start = Date()
let end = Date().addingTimeInterval(259200) // +3 dagen
let interval = DateInterval(start: start, end: end)

// Demonstratie van verschillende locales
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))")
}

// Lokalisatie voor tijdsintervallen
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) tijd: \(formatter.string(from: timeInterval))")
}

Lokalisatiekenmerken: voor het Nederlands gebruikt DateIntervalFormatter de voorzetsels „van“ en „tot“ voor lange datumnotaties. Voor korte (short) notatie — alleen koppelteken: 21.07–25.07.2024. Voor volledige notatie (full) — met vermelding van de dag van de week. De keuze van de notatie hangt af van de context: voor een boekingslijst gebruikt u .medium, voor een gedetailleerde weergave — .long of .full.

Vergelijking met andere datumformatters

DateIntervalFormatter vult de niche van het formatteren van datumbereiken die andere Foundation-klassen niet dekken. DateFormatter formatteert afzonderlijke datums, RelativeDateTimeFormatter — relatieve datums (geleden/binnen), DateComponentsFormatter — duur (2 uur 30 minuten). Elk van deze klassen lost zijn eigen taak op en kan niet door elkaar worden vervangen.

KlasseDoelVoorbeelduitvoer
DateIntervalFormatterDatumbereik21–25 juli 2024
DateFormatterAfzonderlijke datum21 juli 2024
RelativeDateTimeFormatterRelatieve tijd3 dagen geleden
DateComponentsFormatterDuur2 uur 30 minuten
ISO8601DateFormatterISO 8601 notatie2024-07-21T14:30:00Z

Wanneer DateIntervalFormatter gebruiken: voor het weergeven van datumbereiken in de UI — hotelboekingen, evenementen, filteren op datums, operationele geschiedenis. Voor het berekenen van de duur tussen datums gebruikt u DateComponentsFormatter, niet DateIntervalFormatter — de laatste is niet bedoeld voor het weergeven van duur. DateFormatter mag alleen worden gebruikt voor afzonderlijke datums, niet voor het samenvoegen van twee opgemaakte datums door stringconcatenatie — dit leidt tot verlies van lokalisatie van het scheidingsteken.

Randgeval: DateIntervalFormatter ondersteunt geen weergave van open bereiken (zonder einddatum). Als het einde van het bereik onbekend is (bijvoorbeeld „vanaf 21 juli“), gebruikt u DateFormatter met het voorzetsel „vanaf“ voor het Nederlands of „from“ voor het Engels. DateIntervalFormatter ondersteunt ook geen bereiken met tijdsaanduiding voor verschillende dagen — tijd wordt afzonderlijk op elke datum toegepast, wat overbodig kan lijken voor korte bereiken.

Veelgestelde vragen

Wat is DateIntervalFormatter?

DateIntervalFormatter — Foundation-klasse voor het formatteren van datumbereiken naar gelokaliseerde strings. Beschikbaar vanaf iOS 8, groepeert automatisch herhalende componenten (maand, jaar) en selecteert het juiste scheidingsteken voor de taal.

Hoe groepeert DateIntervalFormatter datums?

Vergelijkt componenten van jaar tot dag. Als het jaar overeenkomt — wordt het eenmaal weergegeven. Als de maand overeenkomt — wordt deze eenmaal weergegeven. Verschillende dagen worden weergegeven als bereik. Dit geeft „21–25 juli 2024“ in plaats van „21 juli 2024 – 25 juli 2024“.

Kan ik het scheidingsteken van het bereik wijzigen?

Nee, het scheidingsteken wordt bepaald door locale en kan niet via API worden geconfigureerd. Voor een aangepast scheidingsteken (bijvoorbeeld „tot en met“ in plaats van „–“) formatteert u elke datum met een afzonderlijke DateFormatter en voegt u de strings handmatig samen.

Wat is het verschil tussen DateIntervalFormatter en DateFormatter?

DateIntervalFormatter formatteert een datumbereik (twee datums) als een geheel met groepering van componenten. DateFormatter formatteert een enkele datum. Gebruik voor bereiken altijd DateIntervalFormatter — dit zorgt voor correcte lokalisatie van het scheidingsteken.

Hoe formatteer ik een bereik met verschillende jaren?

Automatisch — DateIntervalFormatter detecteert dat de jaren verschillen en geeft volledige datums weer voor beide uiteinden: „25 december 2024 – 5 januari 2025“. Geen extra instellingen nodig, het instellen van dateStyle is voldoende.

Samenvatting

  • DateIntervalFormatter — gespecialiseerde klasse voor het formatteren van datumbereiken (iOS 8+)
  • Automatisch groeperen — herhalende componenten (jaar, maand) worden eenmaal weergegeven voor het hele bereik
  • Gelokaliseerde scheidingstekens — „van–tot“ (Nederlands), koppelteken (Engels), „bis“ (Duits) — automatisch
  • Datums- en tijdstijlen — combinaties van .none, .short, .medium, .long, .full voor elk uiteinde van het bereik
  • Niet geschikt voor duur — gebruik DateComponentsFormatter voor het berekenen van duur
  • Ondersteunt geen aangepaste scheidingstekens — voor niet-standaard gevallen is handmatige formattering vereist
  • Integratie met DateInterval — de DateInterval-structuur biedt contains- en intersection-controles

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

Lees ook