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

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

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

Начать курс

Работа с датами в 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

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