Работа с датами в Swift (iOS/macOS): обзор библиотек
Работа с датами и временем — одна из самых частых и одновременно сложных задач в разработке под iOS и macOS. Стандартный фреймворк Foundation предоставляет мощные, но не всегда интуитивные инструменты: Date, DateFormatter, Calendar, TimeInterval. Однако для упрощения рутинных операций (парсинг строк, человекочитаемые интервалы, локализация) существуют специализированные библиотеки. В этой статье разберём основные подходы и популярные инструменты.
1. Встроенные средства Foundation
Прежде чем подключать сторонние решения, важно уметь работать с нативными инструментами. Основные классы:
Date— точка во времени (с точностью до секунды).DateFormatter— преобразование строки в дату и обратно.Calendar— работа с календарными единицами (год, месяц, день).TimeInterval— разница между датами в секундах.
Пример: форматирование даты
import Foundation
let now = Date()
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
formatter.locale = Locale(identifier: "ru_RU")
let dateString = formatter.string(from: now)
print(dateString) // 2025-02-18 14:30:00
Пример: вычисление разницы в днях
let calendar = Calendar.current
let start = Date()
let end = calendar.date(byAdding: .day, value: 7, to: start)!
let components = calendar.dateComponents([.day], from: start, to: end)
print(components.day!) // 7
Этих возможностей достаточно для большинства базовых сценариев. Но как только требуется сложный парсинг или локализация, код становится громоздким.
2. Библиотека DateHelper
DateHelper — легковесная библиотека (доступна через Swift Package Manager), которая добавляет удобные расширения к Date. Главная фишка — человекочитаемые относительные даты.
Установка: в Package.swift добавьте зависимость https://github.com/melvitax/DateHelper.
Пример: «3 часа назад»
import DateHelper
let pastDate = Date() - 3.hours
print(pastDate.toRelativeString()) // "3 hours ago"
// При локализации: print(pastDate.toRelativeString(locale: "ru"))
Библиотека поддерживает множество форматов вывода: .short, .medium, .full. Это идеальный вариант для приложений, где нужно показывать «только что», «вчера», «2 недели назад» без написания собственного парсера.
3. SwiftDate — самый мощный инструмент
SwiftDate (автор: Daniele Margutti) — фактически стандарт де-факто для работы с датами в Swift. Включает:
- Парсинг строк с автодетектом формата.
- Манипуляции с датами (добавление/вычитание компонентов).
- Вычисление разницы в любых единицах.
- Локализация (поддержка 30+ языков).
- Работа с часовыми поясами и календарями.
Установка: через SPM или CocoaPods.
Пример: парсинг строки с неизвестным форматом
import SwiftDate
let dateString = "2025-02-18T14:30:00+03:00"
if let date = dateString.toDate() {
print(date.year) // 2025
print(date.month) // 2
print(date.toFormat("dd MMMM yyyy", locale: Locales.russian)) // "18 февраля 2025"
}
Пример: получение интервала в человекочитаемом виде
let start = DateInRegion(Date())
let end = start + 2.hours + 30.minutes
let interval = start.toRelativeString(end, style: RelativeFormatter.defaultStyle())
print(interval) // "2 hours 30 minutes later"
SwiftDate также умеет работать с DateComponents, поддерживает цепочки операций и кеширование парсинга. Единственный минус — библиотека довольно тяжёлая (около 1 МБ), что критично для очень маленьких приложений.
4. TimeIntervalFormatter — форматирование интервалов
Когда нужно просто отобразить длительность (например, таймер), можно использовать TimeIntervalFormatter — часть экосистемы SwiftDate, но доступна и как отдельный модуль. Позволяет конвертировать TimeInterval
Также в библиотеке
Мониторинг приложений Java: инструменты и библиотеки для сбора метрик
TypeDoc для TypeScript: полное руководство с примерами
Парсинг HTML в Go (Golang): библиотеки и примеры кода
WebSocket библиотеки Rust: Tokio-tungstenite и async-tungstenite для реального времени
Swagger/OpenAPI генерация для Swift: инструменты и библиотеки