Swift Academy · 课时

Calendar 与 DateComponents

跨日历执行日期运算。

第 2 / 4 课13 个步骤

Calendar 与 DateComponents 是 CoddyKit 上的免费 Swift Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Swift Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Swift Academy 课程共包含 4 节课。

日历和 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(from:) 请求日历生成相应的 Date。

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))

为什么要使用日历

通过添加原始秒数来进行运算,在跨越 DST 或月份边界时会出错。进行日、月、年运算时,请始终使用日历。

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 通过 DateComponents 在 Date 与命名字段之间进行转换。您已经提取了字段、构造了日期、使用 date(byAdding:) 添加了单位、计算了差异,也了解了为什么日历运算优于直接计算秒数。下一步:为显示格式化日期。

免费开始

用 AI 导师学习 Swift — 免费

在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。

课程
122
课程
409

常见问题解答

「Calendar 与 DateComponents」课时是免费的吗?

是的 — 「Calendar 与 DateComponents」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Swift Academy 课程的其余内容,请升级到 CoddyKit PRO。 Swift Academy 课程共包含 4 节课。

「Calendar 与 DateComponents」这节课中我会学到什么?

跨日历执行日期运算。 你通过在浏览器中直接运行的动手代码来练习 Swift Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Swift Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Swift Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「Calendar 与 DateComponents」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Swift Academy 课中编写并运行代码吗?

能。每节 Swift Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. Date 类型与时间间隔
  2. Calendar 与 DateComponents
  3. 格式化日期
  4. 时区与区域设置
← 返回 Swift Academy