ISO8601DateFormatter: əsas anlayışlar və ISO 8601 formatlaşdırma

Müəllif: IT Sectr Dərc olunub: 2026-07-13 Oxuma vaxtı: 9 dəq

ISO8601DateFormatter — iOS və macOS-da Foundation sinfi olub, beynəlxalq ISO 8601 standartında tarixlərin formatlaşdırılması və pars edilməsi üçün nəzərdə tutulub. Apple Developer Documentation, 2024-ə görə, ISO8601DateFormatter DateFormat-i əl ilə təyin etmədən milisaniyələr, vaxt qurşaqları və saniyə kəsrləri ilə formatları avtomatik idarə edir. DateFormatter-dən fərqli olaraq, bu sinif Locale və TimeZone-dan asılı deyil — o, ISO 8601 spesifikasiyasına ciddi şəkildə əməl edir ki, bu da onu server və müştəri arasında tarix mübadiləsi üçün ideal edir. Sinif iOS 10 və macOS 10.12-dən etibarən mövcuddur.

Əsas məqamlar

  • ISO8601DateFormatter — ISO 8601 standartı üzrə tarixləri formatlaşdırmaq üçün Foundation sinfi
  • DateFormat tələb etmir — format seçimlərin parametrlərinə əsasən avtomatik müyən edilir
  • Yerli parametrlərdən asılı deyil — Locale qurulması olmadan bütün cihazlarda eyni işləyir
  • Milisaniyə dəstəyi — istənilən dəqiqlikdə saniyə kəsrlərini emal edir (üç, altı və daha çox simvol)
  • Formatlaşdırma seçimləri — withFullDate, withTime, withMilliseconds, withTimeZone və digərləri çıxış komponentlərini idarə edir

ISO8601DateFormatter nədir?

ISO8601DateFormatter — Foundation-da Formatter-in ixtisaslaşdırılmış alt sinfi olub, Date və ISO 8601 formatlı sətir arasında ikitərəfli çevirmə həyata keçirir. ISO 8601 standartı (International Standard for the Representation of Dates and Times) tarix və vaxt mübadiləsi üçün beynəlxalq formatı müyən edir: 2024-07-21T14:30:00+00:00. DateFormatter-dən fərqli olaraq, bu sinif dateFormat təyin etməyi tələb etmir və verilmiş seçimlər əsasında sətrin strukturunu avtomatik müyən edir.

ISO8601DateFormatter-in DateFormatter qarşısında əsas üstünlükləri: locale-dən asılılığın olmaması (pars etmə istənilən cihazda eyni işləyir), saniyə kəsrlərinin daxili dəstəyi (vergüldən sonra istənilən sayda simvolla) və ötürülən seçimlər əsasında formatın avtomatik müyən edilməsi. Sinif həmçinin Z şəkilçisini (UTC təyini), +HH:mm formatında vaxt qurşaqlarını və azaldılmış dəqiqliyi (vaxtsız yalnız tarix) düzgün idarə edir.

ISO Specification (ISO 8601-1:2019)-a görə, standart dörd dəqiqlik səviyyəsini dəstəkləyir: il (2024), il-ay (2024-07), tam tarix (2024-07-21) və vaxt qurşağı ilə tarix-vaxt (2024-07-21T14:30:00+00:00). ISO8601DateFormatter format seçimlərinin kombinasiyası vasitəsilə bütün bu səviyyələri əhatə edir və proqramçını əl ilə dateFormat sətri yazmaqdan azad edir.

ISO8601DateFormatter Foundation-da necə işləyir?

İşləmə prinsipi ISO8601DateFormatter bit seçimlərinin (formatOptions) kombinasiyasına əsaslanır, onların hər biri çıxışda müəyyən tarix və ya vaxt komponentini aktivləşdirir. Məsələn, .withFullDate seçimi il, ay və günü aktivləşdirir; .withTime — saat, dəqiqə və saniyələri. Seçimləri birləşdirərək, proqramçı dateFormat sətri yazmadan lazımi dəqiqlik səviyyəsini əldə edir.

Daxili olaraq ISO8601DateFormatter pars etmə üçün ICU kitabxanasından istifadə edir, lakin sabit ISO 8601 qaydaları ilə. Bu o deməkdir ki, o, cihazda qurulmuş Locale və TimeZone tənzimləmələrini görməz—nəticə həmişə proqnozlaşdırıla biləndir. Vaxt qurşağını təyin etmək üçün timeZone xüsusiyyəti istifadə olunur, ilkin olaraq UTC-yə bərabərdir. timeZone nil olaraq təyin edilɐrsə, cihazın yerli vaxtı istifadə olunur.

SeçimTəsvirÇıxış nümunəsi
.withFullDateİl, ay, gün2024-07-21
.withTimeSaat, dəqiqə, saniyə14:30:00
.withMillisecondsSaniyə kəsrləri (3 simvola qədər).123
.withFractionalSecondsSaniyə kəsrləri (istənilən dəqiqlik).123456
.withTimeZoneVaxt qurşağı+03:00
.withColonSeparatorInTimeZoneVaxt qurşağında : ayırıcısı+03:00 (+0300 əvəzinə)
.withInternetDateTimeTam format (date + time + tz)2024-07-21T14:30:00+00:00

Seçimlərin birləşdirilməsi: .withInternetDateTime .withFullDate, .withTime və .withTimeZone-un birləşməsinə bərabərdir. Milisaniyələrlə sətrləri pars etmək üçün .withFractionalSeconds əlavə edin. Yadda saxlamaq vacibdir ki, .withMilliseconds saniyə kəsrlərini üç simvolla məhdudlaşdırır, .withFractionalSeconds isə istənilən dəqiqliyi dəstəkləyir — vergüldən sonra birdən doqquz rəqəmə qədər.

ISO 8601 formatının tənzimləmələri

Format seçimləri ISO8601DateFormatter üç qrupa bölünür: tarix komponentləri (withFullDate, withYear, withMonth, withDay, withWeekOfYear), vaxt komponentləri (withTime, withHours, withMinutes, withSeconds) və əlavə tənzimləmələr (withMilliseconds, withFractionalSeconds, withTimeZone, withColonSeparatorInTimeZone, withDashSeparatorInDate, withFullTime). Onları birləşdirərək, ISO 8601-in demək olar ki, istənilən alt formatını əldə etmək olar.

Əsas seçim kombinasiyaları

  • .withFullDate — yalnız tarix: 2024-07-21. YYYY-MM-DD formatlı sətrləri pars etmək üçün
  • .withFullDate + .withTime — vaxt qurşağı olmadan tarix və vaxt: 2024-07-21T14:30:00
  • .withInternetDateTime — tam format: 2024-07-21T14:30:00Z və ya 2024-07-21T14:30:00+03:00
  • .withInternetDateTime + .withFractionalSeconds — saniyə kəsrləri ilə: 2024-07-21T14:30:00.123456+00:00
  • .withFullDate + .withTime + .withTimeZone — tz-də iki nöqtəsiz tam format: 2024-07-21T14:30:00+0300

Vacib nüans: .withFractionalSeconds və .withMilliseconds bir-birini istisna edir — hər ikisi qurulubsa, .withFractionalSeconds tətbiq olunur. Server məlumatlarından milisaniyələri pars etmək üçün .withFractionalSeconds tövsiyə olunur, çünki bir çox server üç, altı və ya doqquz simvolla saniyə kəsrləri göndərir və .withFractionalSeconds istənilən uzunluğu idarə edir.

swift
import Foundation

// ISO8601DateFormatter-ı konfiqurasiya et
let formatter = ISO8601DateFormatter()
formatter.timeZone = TimeZone(secondsFromGMT: 0)

// Müxtəlif format seçim kombinasiyaları
formatter.formatOptions = [.withFullDate]
let dateOnly = formatter.string(from: Date())
print("Tarix: \(dateOnly)")

formatter.formatOptions = [.withFullDate, .withTime]
let dateTime = formatter.string(from: Date())
print("DateTime: \(dateTime)")

formatter.formatOptions = [.withInternetDateTime, .withFractionalSeconds]
let full = formatter.string(from: Date())
print("Tam: \(full)")

// Milisaniyələrlə sətri pars et
let serverString = "2024-07-21T14:30:00.123456+03:00"
if let parsed = formatter.date(from: serverString) {
    print("Pars edildi: \(parsed)")
}

Swift-də ISO8601DateFormatter: kod nümunələri

Əsas istifadə ISO8601DateFormatter-in istifadəsi nümunə yaratmaq, timeZone (server məlumatları üçün UTC tövsiyə olunur) və formatOptions təyin etməkdən ibarətdir, bundan sonra formatlaşdırma üçün string(from:) və pars etmə üçün date(from:) çağırıla bilər. DateFormatter-dən fərqli olaraq, Locale barədə narahat olmaq lazım deyil — sinif regional tənzimləmələri görməz.

swift
import Foundation

let formatter = ISO8601DateFormatter()

// Müxtəlif ISO 8601 formatlarını pars et
let strings: [String] = [
    "2024-07-21T14:30:00Z",
    "2024-07-21T14:30:00+03:00",
    "2024-07-21T14:30:00.123Z",
    "2024-07-21"
]

for str in strings {
    if let autoParsed = formatter.date(from: str) {
        print("Pars edildi '\(str)': \(autoParsed)")
    } else {
        // Yalnız tarix sətrləri üçün withFullDate istifadə et
        formatter.formatOptions = [.withFullDate]
        if let fallback = formatter.date(from: str) {
            print("Fallback pars edildi '\(str)': \(fallback)")
        }
        formatter.formatOptions = [.withInternetDateTime]
    }
}

// RFC 3339-a serializasiya et (GitHub API)
formatter.formatOptions = [.withInternetDateTime, .withFractionalSeconds]
let rfc3339 = formatter.string(from: Date())
print("RFC 3339: \(rfc3339)")

Dəyişən uzunluqlu kəsr saniyələrlə tarixlərin pars edilməsi — bir çox müasir API-lərin xüsusiyyəti. Server həm 2024-07-21T14:30:00.123Z (3 simvol), həm də 2024-07-21T14:30:00.123456Z (6 simvol) göndərə bilər. .withFractionalSeconds seçimi ilə ISO8601DateFormatter hər iki variantı düzgün idarə edəcək, DateFormatter isə dateFormat = “yyyy-MM-dd’T’HH:mm:ss.SSSZ” ilə yalnız üçrəqəmli milisaniyələri idarə edəcək.

swift
import Foundation

let variantFormatter = ISO8601DateFormatter()
variantFormatter.formatOptions = [
    .withInternetDateTime,
    .withFractionalSeconds
]

// Müxtəlif kəsr saniyə dəqiqliyi
let variants: [String] = [
    "2024-07-21T14:30:00.1Z",
    "2024-07-21T14:30:00.12Z",
    "2024-07-21T14:30:00.123Z",
    "2024-07-21T14:30:00.123456Z",
    "2024-07-21T14:30:00.123456789Z"
]

for variant in variants {
    if let parsed = variantFormatter.date(from: variant) {
        print("OK: \(variant) -> \(parsed)")
    } else {
        print("FAIL: \(variant)")
    }
}

// WithMilliseconds istifadə et (yalnız 3 rəqəm)
variantFormatter.formatOptions = [
    .withInternetDateTime,
    .withMilliseconds
]
let milliParsed = variantFormatter.string(from: Date())
print("Milisaniyələrlə: \(milliParsed)")

Bütün variantların pars edilməsinin sınaqdan keçirilməsi: yuxarıdakı kod göstərir ki, .withFractionalSeconds ilə ISO8601DateFormatter 1-dən 9-a qədər istənilən uzunluqdakı saniyə kəsrlərini uğurlu şəkildə emal edir. Bu, müxtəlif server platformaları ilə uyğunluq üçün vacibdir: .NET tez-tez 7 simvol (100 nanosaniyəlik tik), Python — 6, Java isə versiyadan asılı olaraq 3 və ya 9 simvol yaradır.

ISO 8601 üçün DateFormatter ilə müqayisə

DateFormatter də ISO 8601-i pars edə bilər, lakin dateFormat, locale və timeZone-un əl ilə təyin edilməsini tələb edir. Əsas problem DateFormatter-in Locale-dən asılı olmasıdır və en_US_POSIX qurulmazsa, qeyri-standart tarix formatları olan regionlardakı istifadəçilərdə pars etmə pozula bilər. ISO8601DateFormatter bu problemi memarlıq səviyyəsində həll edir: o, Locale istifadə etmir.

ParametrISO8601DateFormatterDateFormatter
Locale qurulmasıTələb olunmur (görməz)en_US_POSIX məcburidir
DateFormatAvtomatik (seçimlər vasitəsilə)Əl ilə format sətri
Kəsr saniyələrİstənilən dəqiqlik (.withFractionalSeconds)Sabit SSS
Z şəkilçisiDüzgün emal edirDateFormat vasitəsilə
PerformansDaha yüksək (ixtisaslaşdırılmış)Daha aşağı (ümumi)
StandartYalnız ISO 8601İstənilən format
iOS versiyasıiOS 10+iOS 2+

DateFormatter nə vaxt istifadə edilməli: tarixi ISO 8601 olmayan formatda formatlaşdırmaq lazımdırsa (məsələn, UI üçün „21 iyul 2024”) və ya iOS 9 və köhnə versiyaları dəstəklənməlidirsə. Serverlə tarix mübadiləsi ilə bağlı bütün tapşırıqlar üçün ISO8601DateFormatter istifadə edin — o, daha təhlükəsiz, daha məhsuldar və daha az kod tələb edir. ISO 8601 üçün DateFormatter locale və regional tənzimləmələrlə bağlı potensial səhvlər mənbəyidir.

DateFormatter-dən ISO8601DateFormatter-ə miqrasiya: DateFormatter yaratma + dateFormat + locale + timeZone qurma əvəzinə ISO8601DateFormatter yarat + formatOptions + timeZone qurun. Sətrin pars edilməsi date(from:) vasitəsilə dəyişməz qalır. Geriyə uyğunluq üçün DateFormatter-ə fallback ilə #available(iOS 10, *) istifadə edilə bilər.

ISO 8601 pars edərkən tipik səhvlər

Unudulmuş formatOptions qurulması formatter-in ilkin dəyər olan .withInternetDateTime istifadə etməsinə səbəb olur. Server vaxtsız yalnız tarix göndərɐrsə (2024-07-21), pars etmə nil qaytaracaq. Həmişə formatOptions-un serverdən gələ biləcək bütün mümkün formatları əhatə etdiyini yoxlayın. Dəyişən formatlı API-lər üçün müxtəlif seçim kombinasiyaları ilə fallback cəhdlərindən istifadə edin.

withMilliseconds və withFractionalSeconds arasında qarışıqlıq — saniyə kəsrləri ilə tarixləri pars edərkən tez-tez rast gəlinən səhv. withMilliseconds vergüldən sonra dəqiq 3 rəqəm gözləyir. Server 6 rəqəm göndərɐrsə (mikrosaniyələr), withMilliseconds ilə pars etmə səhvlə başa çatacaq. İstənilən sayda simvolla uyğunluq üçün .withFractionalSeconds istifadə edin. .withFractionalSeconds iOS 13-də ortaya çıxdı; köhnə versiyalar üçün dateFormat ilə DateFormatter istifadə edin.

Vaxt qurşağının görməməzlikdən gəlinməsi — digər geniş yayılmış problem. Server vaxt qurşağı ilə tarix göndərɐrsə (+03:00), formatter isə UTC-yə qurulubsa, pars etmə pozulmayacaq, lakin nəticə UTC-də olacaq. Tərtibatçılar tez-tez Date-in vaxt qurşağını saxlayacağını gözləyirlər, lakin Date mütləq zaman anıdır və vaxt qurşağı məlumatını saxlamır. Düzgün göstərmə üçün vaxt qurşağını ayrıca saxlayın və ya düzgün timeZone ilə ISO8601DateFormatter istifadə edin.

Apple Forum (2024)-a görə, ISO8601DateFormatter ilə bağlı sualların təxminən 20%-i saniyələrin isteğə bağlı olduğu formatla bağlıdır. ISO 8601 standartı saniyəsiz formatı icazə verir: 2024-07-21T14:30+03:00. .withInternetDateTime ilə ISO8601DateFormatter bu formatı dəstəkləmir — onu pars etmək üçün dateFormat = “yyyy-MM-dd’T’HH:mmZ” ilə DateFormatter tələb olunacaq. Bu məhdudiyyət qısaltılmış vaxt formatından istifadə edən API-lərlə işləyərkən nəzərə alınmalıdır.

Tez-tez verilən suallar

ISO8601DateFormatter nədir?

ISO8601DateFormatter — ISO 8601 formatında tarixləri formatlaşdırmaq və pars etmək üçün ixtisaslaşdırılmış Foundation sinfi, iOS 10-dan etibarən mövcuddur. dateFormat-i əl ilə təyin etmədən standart formatları avtomatik idarə edir.

ISO8601DateFormatter DateFormatter-dən nə ilə fərqlənir?

ISO8601DateFormatter Locale-dən asılı deyil, dateFormat əvəzinə seçimlərdən istifadə edir və istənilən uzunluqdakı saniyə kəsrlərini düzgün idarə edir. DateFormatter universaldır, lakin əl ilə qurulma tələb edir və regional tənzimləmələrlə bağlı səhvlərə məruz qalır.

Dəyişən uzunluqlu kəsr saniyələrini necə idarə etməli?

.withFractionalSeconds seçimindən istifadə edin — vergüldən sonra 1-dən 9-a qədər simvolu dəstəkləyir. Dəqiqlik dəyişə bilɐrsə, .withMilliseconds istifadə etməyin. .withFractionalSeconds iOS 13-dən etibarən mövcuddur.

ISO8601DateFormatter hansı vaxt qurşağından istifadə edir?

İlkin olaraq UTC. Dəyişdirmək üçün timeZone xüsusiyyətini təyin edin. timeZone = nil olarsa, cihazın yerli vaxtı istifadə olunur. +HH:MM formatında açıq vaxt qurşağı ilə sətri pars edərkən formatter onu avtomatik nəzərə alır.

Niyə vaxtsız tarixin pars edilməsi nil qaytarır?

Çünki formatOptions ilkin olaraq .withInternetDateTime-dır, tarix + vaxt + vaxt qurşağı gözləyir. Yalnız tarixi pars etmək üçün formatOptions = [.withFullDate] təyin edin. Hər iki variantı dəstəkləmək üçün müxtəlif seçimlərlə fallback istifadə edin.

Nəticə

  • ISO8601DateFormatter — ISO 8601 üçün ixtisaslaşdırılmış sinif, DateFormatter-dən daha təhlükəsiz və sadədir
  • Format seçimləri əl ilə dateFormat-i əvəz edir — .withFullDate, .withTime, .withTimeZone birləşdirin
  • Locale-dən asılı deyil — locale qurulması olmadan bütün cihazlarda eyni pars edir
  • .withFractionalSeconds istənilən dəqiqlikdə saniyə kəsrlərini idarə edir (1–9 simvol)
  • DateFormatter uduzur ISO 8601 tapşırıqları üçün performans, təhlükəsizlik və sadəlik baxımından
  • Seçim qarışıqlığı — withMilliseconds və withFractionalSeconds bir-birini əvəz edə bilməz
  • Saniyəsiz format (2024-07-21T14:30+03:00) dəstəklənmir — DateFormatter tələb olunur

Açar təslim mobil tətbiq hazırlayacağıq

IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.

Layihəni müzakirə et

Həm də oxuyun