Calendar 与 DateComponents
跨日历执行日期运算。
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 反馈 — 无需本地设置。
此课程中的所有课时
- Date 类型与时间间隔
- Calendar 与 DateComponents
- 格式化日期
- 时区与区域设置