Работа с датами и временем в Swift: полное руководство

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

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

Начать курс

Введение в работу с датами и временем в Swift

Работа с датами и временем — одна из ключевых задач в разработке приложений для iOS и macOS. Будь то отображение текущей даты, расчёт разницы между событиями или планирование уведомлений — Swift предоставляет мощный и гибкий инструментарий для этих целей. В этой статье мы разберём основные классы и методы: Date, DateFormatter, Calendar, DateComponents и TimeInterval. Вы узнаете, как создавать, форматировать, сравнивать и манипулировать датами в Swift.

Материал будет полезен как новичкам, так и опытным разработчикам, желающим систематизировать знания. Все примеры кода можно сразу использовать в своих проектах.

Основные классы для работы с датами

Класс Date

Date — это фундаментальный тип, представляющий конкретный момент времени, независимо от часового пояса или календаря. Он хранит количество секунд, прошедших с 1 января 2001 года (эпохи Cocoa).

import Foundation

// Текущая дата и время
let now = Date()
print("Сейчас: \(now)")

// Дата через 1 час
let oneHourLater = Date(timeIntervalSinceNow: 3600)
print("Через час: \(oneHourLater)")

// Дата из заданного количества секунд с эпохи
let epochDate = Date(timeIntervalSinceReferenceDate: 0)
print("Эпоха Cocoa: \(epochDate)")

TimeInterval

TimeInterval — это просто псевдоним для Double, представляющий количество секунд. Используется для задания временных интервалов.

let interval: TimeInterval = 86400 // 24 часа в секундах
let tomorrow = Date(timeIntervalSinceNow: interval)
print("Завтра: \(tomorrow)")

DateFormatter

DateFormatter отвечает за преобразование даты в строку и обратно. Это один из самых часто используемых классов.

let formatter = DateFormatter()
formatter.dateStyle = .long
formatter.timeStyle = .short

let currentDate = Date()
let dateString = formatter.string(from: currentDate)
print("Отформатированная дата: \(dateString)")

// Обратное преобразование
let dateFromString = formatter.date(from: "15 апреля 2025 г., 14:30")
print("Дата из строки: \(dateFromString ?? Date())")

Вы можете задать собственный формат с помощью dateFormat:

formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
let customString = formatter.string(from: Date())
print("Кастомный формат: \(customString)")

Календарь и компоненты даты

Calendar

Calendar позволяет работать с датами в контексте конкретного календаря (григорианский, исламский и т.д.) и часового пояса.

let calendar = Calendar.current
let components = calendar.dateComponents([.year, .month, .day, .hour, .minute], from: Date())
print("Год: \(components.year!), Месяц: \(components.month!), День: \(components.day!)")

DateComponents

DateComponents — это структура, содержащая отдельные компоненты даты (год, месяц, день, час и т.д.). Она используется для создания новых дат или извлечения частей из существующих.

// Создание даты из компонентов
var birthdayComponents = DateComponents()
birthdayComponents.year = 1990
birthdayComponents.month = 6
birthdayComponents.day = 15
birthdayComponents.hour = 10

if let birthday = calendar.date(from: birthdayComponents) {
    print("День рождения: \(birthday)")
}

// Добавление дней к дате
if let nextWeek = calendar.date(byAdding: .day, value: 7, to: Date()) {
    print("Через неделю: \(nextWeek)")
}

Компоненты можно использовать для проверки свойств даты:

let isToday = calendar.isDateInToday(Date())
print("Сегодня? \(isToday)")

let isWeekend = calendar.isDateInWeekend(Date())
print("Выходной? \(isWeekend)")

Сравнение и манипуляции с датами

Сравнение дат

Swift поддерживает стандартные операторы сравнения для Date:

let date1 = Date()
let date2 = Date(timeIntervalSinceNow: 3600)

if date1 < date2 {
    print("date1 раньше date2")
} else if date1 == date2 {
    print("даты равны")
} else {
    print("date1 позже date2")
}

// Более точное сравнение с помощью Calendar
let result = calendar.compare(date1, to: date2, toGranularity: .day)
switch result {
case .orderedAscending:
    print("date1 раньше по дню")
case .orderedDescending:
    print("date1 позже по дню")
case .orderedSame:
    print("один и тот же день")
}

Вычисление разницы

let startDate = Date()
let endDate = Date(timeIntervalSinceNow: 86400 * 3) // через 3 дня

let diffComponents = calendar.dateComponents([.day, .hour, .minute], from: startDate, to: endDate)
print("Разница: \(diffComponents.day!) дней, \(diffComponents.hour!) часов")

// Простая разница в секундах
let timeInterval = endDate.timeIntervalSince(startDate)
print("Секунд между датами: \(timeInterval)")

Округление и начало дня

// Начало текущего дня
let startOfDay = calendar.startOfDay(for: Date())
print("Начало дня: \(startOfDay)")

// Конец дня (23:59:59)
if let endOfDay = calendar.date(bySettingHour: 23, minute: 59, second: 59, of: Date()) {
    print("Конец дня: \(endOfDay)")
}

Практические примеры

Форматирование для UI

Часто требуется отобразить дату в удобочитаемом виде для пользователя:

let relativeFormatter = RelativeDateTimeFormatter()
relativeFormatter.unitsStyle = .full
let relativeString = relativeFormatter.localizedString(for: Date(timeIntervalSinceNow: -7200), relativeTo: Date())
print("Относительное время: \(relativeString)") // "2 часа назад"

// Локализованное форматирование
let localizedFormatter = DateFormatter()
localizedFormatter.locale = Locale(identifier: "ru_RU")
localizedFormatter.dateFormat = "EEEE, d MMMM yyyy"
print(localizedFormatter.string(from: Date())) // "вторник, 15 апреля 2025"

Работа с временными зонами

var moscowCalendar = Calendar(identifier: .gregorian)
moscowCalendar.timeZone = TimeZone(identifier: "Europe/Moscow")!

let moscowComponents =                

Блоги

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