Работа с датами в Swift: Foundation, SwiftDate, DateTools (iOS/macOS)

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Работа с датами в Swift (iOS/macOS): обзор библиотек

В разработке под iOS и macOS работа с датами и временем — одна из ключевых задач. Стандартный фреймворк Foundation предоставляет мощные, но иногда громоздкие инструменты. Для упрощения кода и повышения читаемости разработчики часто используют сторонние библиотеки. В этой статье мы рассмотрим нативные возможности Swift (Foundation) и две популярные библиотеки: SwiftDate и DateTools.

1. Foundation: встроенные возможности

Базовый инструментарий Foundation включает Date, DateFormatter, Calendar и TimeZone. Этого достаточно для большинства задач, но требует многословного кода.

Пример: создание и форматирование даты

import Foundation

let now = Date()
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
formatter.timeZone = TimeZone(abbreviation: "UTC")
let dateString = formatter.string(from: now)
print(dateString) // 2025-04-01 14:30:00

Пример: вычисление разницы между датами

let startDate = Date()
let endDate = Calendar.current.date(byAdding: .day, value: 7, to: startDate)!
let components = Calendar.current.dateComponents([.day, .hour], from: startDate, to: endDate)
print("\(components.day!) дней, \(components.hour!) часов")

Плюсы Foundation: нет зависимостей, полный контроль, поддержка всех часовых поясов и календарей.
Минусы: много кода для простых операций, сложность с локализацией и относительными датами.

2. SwiftDate — мощная и гибкая библиотека

SwiftDate — одна из самых популярных библиотек для работы с датами в Swift. Она расширяет возможности Foundation, добавляя удобные методы для парсинга, форматирования, манипуляций и работы с временными зонами.

Установка (Swift Package Manager)

// Package.swift
dependencies: [
    .package(url: "https://github.com/malcommac/SwiftDate.git", from: "6.3.0")
]

Пример: создание даты из строки

import SwiftDate

let date = "2025-04-01T14:30:00+0000".toDate()
print(date?.toFormat("dd.MM.yyyy HH:mm")) // 01.04.2025 14:30

Пример: относительные даты и интервалы

let now = Date()
let oneWeekAgo = now - 1.weeks
print(oneWeekAgo.toRelative()) // "1 week ago"

let nextMonth = now + 1.months
print(nextMonth.toFormat("MMMM yyyy")) // May 2025

Пример: работа с часовыми поясами

let parisDate = DateInRegion(Date(), region: .init(calendar: Calendars.gregorian, zone: Zones.europeParis, locale: Locales.french))
print(parisDate.toFormat("HH:mm")) // время в Париже

Плюсы SwiftDate: лаконичный синтаксис, встроенная поддержка относительных дат, регионов и локалей, мощный парсинг.
Минусы: большой размер библиотеки (~2 МБ), может быть избыточна для простых проектов.

3. DateTools — простота и читаемость

DateTools — легковесная библиотека, ориентированная на удобство чтения кода. Она добавляет методы к Date для быстрого вычисления интервалов, сравнения и форматирования.

Установка (CocoaPods)

pod 'DateToolsSwift'

Пример: проверка временных интервалов

import DateToolsSwift

let date1 = Date()
let date2 = date1 + 2.hours
print(date2.isToday) // true
print(date1.earlierDate(date2) == date1) // true

Пример: человекочитаемые строки

let pastDate = Date() - 3.days
print(pastDate.timeAgoSinceNow) // "3 days ago"

let futureDate = Date() + 1.weeks
print(futureDate.timeAgoSinceNow) // "in 1 week"

Пример: работа с компонентами

let date = Date()
let components = date.components
print("\(components.year)-\(components.month)-\(components.day)") // 2025-4-1

Плюсы DateTools: минималистичный API, легковесность, отличная читаемость.
Минусы: меньше возможностей, чем у SwiftDate, нет встроенной поддержки сложных реги

Рекомендаций