在 Swift 中处理日期和时间:从基础到高级技巧
处理日期和时间是开发 iOS 和 macOS 应用程序的关键任务之一。Swift 为此提供了强大而灵活的工具集:Date、DateFormatter、Calendar、DateComponents 和 TimeInterval。在本文中,我们将深入探讨每一个工具,展示实际示例,并学习如何解决格式化日期、计算时间差以及处理时区和日历等典型任务。
1. 基础:Date 类和 TimeInterval
表示时间点的基础类型是 Date。它存储自 2001 年 1 月 1 日 00:00:00 UTC(Apple 的参考日期)以来经过的秒数。
创建和比较日期:
import Foundation
// 当前日期和时间let now = Date()print("现在: \\(now)")
// 基于时间间隔的日期(从当前时刻起 120 秒)let futureDate = Date(timeIntervalSinceNow: 120)print("2 分钟后: \\(futureDate)")
// 基于自参考日期的固定时间间隔的日期let specificDate = Date(timeIntervalSinceReferenceDate: 3600 * 24 * 365) // 从 2001 年起 1 年print("大致日期: \\(specificDate)")
// 比较日期if now < futureDate { print("当前日期早于未来日期")}TimeInterval 只是表示秒数的 Double 的别名。它用于计算日期之间的差值:
let startDate = Date()sleep(2) // 模拟延迟let endDate = Date()
let elapsed: TimeInterval = endDate.timeIntervalSince(startDate)print("经过了 \\(elapsed) 秒") // 将输出 ~2.0
// 逆向操作let minutes: TimeInterval = 5 * 60let fiveMinutesLater = Date(timeInterval: minutes, since: startDate)2. 使用 DateFormatter 格式化日期
为了以用户可读的格式显示日期,使用 DateFormatter。它支持本地化和多种样式。
基本格式化:
let formatter = DateFormatter()formatter.locale = Locale(identifier: "zh_CN") // 中文区域设置formatter.timeZone = TimeZone.current // 当前时区
// 标准样式formatter.dateStyle = .fullformatter.timeStyle = .shortprint(formatter.string(from: Date())) // 例如:"2025年2月24日星期五 下午2:30"
formatter.dateStyle = .mediumformatter.timeStyle = .noneprint(formatter.string(from: Date())) // "2025年2月24日"自定义格式:
formatter.dateFormat = "yyyy-MM-dd HH:mm"print(formatter.string(from: Date())) // "2025-02-24 14:30"
// 将字符串解析为日期let dateString = "2024-12-25 10:00"if let parsedDate = formatter.date(from: dateString) { print("解析后的日期: \\(parsedDate)")}重要提示: 在解析时,始终检查 date(from:) 是否返回 nil。字符串格式不正确或区域设置不匹配将导致错误。
3. 日历计算:Calendar 和 DateComponents
Calendar 类封装了关于日历系统(公历、伊斯兰历、佛历等)的信息,并允许执行复杂的日期操作。DateComponents 用于描述日期的各个组成部分(年、月、日、小时等)。
提取日期组成部分:
let calendar = Calendar.currentlet components = calendar.dateComponents([.year, .month, .day, .weekday], from: Date())
print("年: \\(components.year!)")print("月: \\(components.month!)")print("日: \\(components.day!)")print("星期几: \\(components.weekday!)") // 1 - 星期日, 2 - 星期一...