在 Swift (iOS/macOS) 中处理日期:库与框架

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

在 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 =

推荐