Calendar и DateComponents
Выполняйте операции с датами в разных календарях.
«Calendar и DateComponents» — бесплатный урок Swift Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Swift Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Swift Academy содержит 4 уроков всего.
Calendar и DateComponents
Calendar интерпретирует объект Date в привычные человеку единицы — год, месяц и день. В DateComponents хранятся полученные отдельные значения.
Текущий календарь
Calendar.current отражает настройки пользователя. Это связующее звено между необработанными моментами времени Date и именованными полями.
import Foundation
let cal = Calendar.current
print("Calendar identifier: \(cal.identifier)")Извлечение компонентов
dateComponents(_:from:) извлекает из даты запрошенные поля и возвращает их в виде значения DateComponents.
import Foundation
let cal = Calendar.current
let comps = cal.dateComponents([.year, .month, .day], from: Date())
print("Year is set: \(comps.year != nil)")Чтение отдельного поля
Сокращённый вызов component(_:from:) напрямую возвращает одно поле в виде значения Int.
import Foundation
let cal = Calendar.current
let weekday = cal.component(.weekday, from: Date())
print("Weekday number between 1 and 7: \(1...7 ~= weekday)")Создание даты из компонентов
Заполните DateComponents и попросите календарь создать соответствующую Date с помощью date(from:).
import Foundation
var comps = DateComponents()
comps.year = 2024
comps.month = 12
comps.day = 25
let cal = Calendar.current
if let date = cal.date(from: comps) {
print("Built a date: \(date.timeIntervalSince1970 > 0)")
}Арифметика дат
date(byAdding:to:) безопасно прибавляет величину компонента, самостоятельно учитывая продолжительность месяцев и високосные годы.
import Foundation
let cal = Calendar.current
let now = Date()
if let nextWeek = cal.date(byAdding: .day, value: 7, to: now) {
print(nextWeek > now)
}Добавление нескольких единиц
Можно добавить несколько единиц одновременно, передав DateComponents с описанием смещения.
import Foundation
let cal = Calendar.current
var offset = DateComponents()
offset.month = 1
offset.day = 3
if let future = cal.date(byAdding: offset, to: Date()) {
print(future > Date())
}Разница между датами
Обратная операция: dateComponents(_:from:to:) возвращает количество прошедших единиц между двумя датами.
import Foundation
let cal = Calendar.current
let now = Date()
let later = now.addingTimeInterval(3 * 86400)
let diff = cal.dateComponents([.day], from: now, to: later)
print("Days apart: \(diff.day ?? -1)")Начало дня
startOfDay(for:) возвращает полночь указанной даты в данном календаре, что удобно для группировки событий по дням.
import Foundation
let cal = Calendar.current
let midnight = cal.startOfDay(for: Date())
print(midnight <= Date())Проверка совпадения дней
isDate(_:inSameDayAs:) сообщает, приходятся ли две даты на один календарный день.
import Foundation
let cal = Calendar.current
let now = Date()
let soon = now.addingTimeInterval(60)
print(cal.isDate(now, inSameDayAs: soon))Зачем нужен Calendar
Арифметика с добавлением необработанных секунд даёт неверный результат при переходе на летнее время и при пересечении границ месяцев. Для вычислений с днями, месяцами и годами всегда используйте Calendar.
import Foundation
let cal = Calendar.current
// Correct: add 1 month, not 30 * 86400 seconds.
if let d = cal.date(byAdding: .month, value: 1, to: Date()) {
print("Added a month correctly: \(d > Date())")
}Быстрая проверка
Какой метод правильно добавляет к дате один месяц?
Итоги
Calendar преобразует Date в именованные поля и обратно с помощью DateComponents. Вы извлекали поля, создавали даты, добавляли единицы с помощью date(byAdding:), вычисляли разницу и увидели, почему календарные вычисления надёжнее арифметики с необработанными секундами. Далее: форматирование дат для отображения.
Часто задаваемые вопросы
Урок «Calendar и DateComponents» бесплатный?
Да — полный текст урока «Calendar и DateComponents» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Swift Academy, подпишись на CoddyKit PRO. Курс Swift Academy содержит 4 уроков всего.
Чему я научусь в уроке «Calendar и DateComponents»?
Выполняйте операции с датами в разных календарях. Ты практикуешь Swift Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Swift Academy?
Предыдущий опыт не требуется. Swift Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Calendar и DateComponents»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Swift Academy?
Да. Каждый урок Swift Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Тип Date и интервалы времени
- Calendar и DateComponents
- Форматирование дат
- Часовые пояса и локали