0Pricing
Swift Academy · Урок

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 — локальная установка не требуется.

Все уроки этого курса

  1. Тип Date и интервалы времени
  2. Calendar и DateComponents
  3. Форматирование дат
  4. Часовые пояса и локали
← Назад к Swift Academy