在 Swift (iOS/macOS) 中处理日期:库与工具概览
在 Apple 生态系统中,日期和时间的处理传统上通过 Foundation 框架实现。然而,对于复杂场景(解析非标准格式、处理相对日期、在不同时区进行操作),开发者通常会求助于第三方库。本文将介绍 Swift 的内置功能以及用于日期处理的流行工具。
1. Foundation 内置工具(Date、DateFormatter、Calendar)
用于日期处理的基本类型是 Date 结构体。它表示一个绝对时间点(自 2001 年 1 月 1 日以来的秒数)。格式化使用 DateFormatter,而日历计算使用 Calendar。
import Foundation
// 获取当前日期let now = Date()print("当前日期: \\(now)")
// 格式化日期let formatter = DateFormatter()formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"formatter.timeZone = TimeZone(identifier: "Europe/Moscow")let formattedDate = formatter.string(from: now)print("格式化后的日期: \\(formattedDate)")
// 将字符串解析为日期let dateString = "2025-03-15 14:30:00"if let parsedDate = formatter.date(from: dateString) { print("解析后的日期: \\(parsedDate)")}
// 日历计算let calendar = Calendar.currentlet tomorrow = calendar.date(byAdding: .day, value: 1, to: now)!print("明天: \\(tomorrow)")2. SwiftDate — 强大的日期处理库
SwiftDate 是 Swift 中最流行的第三方库。它扩展了 Foundation 的功能,增加了:
- 便捷的日期创建语法(例如
DateInRegion) - 相对日期处理(“2小时前”、“3天后”)
- 支持所有时区和日历
- 解析任意格式的字符串
import SwiftDate
// 在区域中创建日期let region = Region(calendar: Calendars.gregorian, zone: Zones.europeMoscow, locale: Locales.russian)let date = DateInRegion("2025-03-15 14:30:00", format: "yyyy-MM-dd HH:mm:ss", region: region)!print("区域中的日期: \\(date)")
// 相对时间let now = DateInRegion()let twoHoursAgo = now - 2.hoursprint("2小时前: \\(twoHoursAgo.toRelative())") // "2小时前"
// 日期之间的差异let later = now + 5.dayslet difference = later - nowprint("差异: \\(difference.days) 天")
// 转换到另一个时区let newYorkRegion = Region(zone: Zones.americaNewYork)let dateInNY = date.convert(to: newYorkRegion)print("在纽约: \\(dateInNY)")3. TimeInterval 和时间间隔处理
TimeInterval 是 Swift 中的一种数据类型,表示秒数。它常用于测量时间间隔和延迟。
import Foundation
// 创建间隔let oneHour: TimeInterval = 3600let twoDays: TimeInterval = 2 * 24 * 3600
// 测量执行时间let start = Date()// 模拟耗时操作sleep(2)let end = Date()let elapsed = end.timeIntervalSince(start)print("过去了 \\(elapsed) 秒")
// 与 DispatchQueue 一起使用DispatchQueue.main.asyncAfter(deadline: .now() + oneHour) { print("一小时过去了")}4. ISO8601DateFormatter — 处理国际格式
为了处理 ISO 8601 格式的日期(常用于 API),Apple 提供了专门的 ISO8601DateFormatter 类。
import Foundation
let isoFormatter = ISO8601DateFormatter()isoFormatter.formatOptions = [.withInternetDateTime, .withFractionalSeconds]
// 解析 ISO 字符串let isoString = "2025-03-15T14:30:00.000Z"if let date =