Работа с датами в 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, нет встроенной поддержки сложных реги