Swift(iOS/macOS)中的日期处理:库与工具

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

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

开始课程

Swift(iOS/macOS)中的日期处理:库概览



日期和时间处理是iOS和macOS开发中最常见且最复杂的任务之一。标准框架Foundation提供了强大但并非总是直观的工具:Date、DateFormatter、Calendar、TimeInterval。然而,为了简化日常操作(字符串解析、人类可读的时间间隔、本地化),存在专门的库。本文将介绍主要方法和流行工具。



1. Foundation内置工具

在引入第三方解决方案之前,掌握原生工具的使用非常重要。主要类:

  • Date — 时间点(精确到秒)。
  • DateFormatter — 字符串与日期之间的转换。
  • Calendar — 处理日历单位(年、月、日)。
  • TimeInterval — 日期之间的秒数差。


示例:日期格式化

import Foundation

let now = Date()let formatter = DateFormatter()formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"formatter.locale = Locale(identifier: "ru_RU")let dateString = formatter.string(from: now)print(dateString) // 2025-02-18 14:30:00


示例:计算天数差

let calendar = Calendar.currentlet start = Date()let end = calendar.date(byAdding: .day, value: 7, to: start)!let components = calendar.dateComponents([.day], from: start, to: end)print(components.day!) // 7


这些功能足以满足大多数基本场景。但一旦需要复杂的解析或本地化,代码就会变得冗长。



2. DateHelper库

DateHelper — 一个轻量级库(可通过Swift Package Manager获取),为Date添加了便捷的扩展。主要特点是人类可读的相对日期。



安装:在Package.swift中添加依赖https://github.com/melvitax/DateHelper。



示例:「3小时前」

import DateHelper

let pastDate = Date() - 3.hoursprint(pastDate.toRelativeString()) // "3 hours ago"// 本地化时:print(pastDate.toRelativeString(locale: "ru"))


该库支持多种输出格式:.short、.medium、.full。对于需要显示「刚刚」、「昨天」、「2周前」而无需编写自定义解析器的应用来说,这是理想的选择。



3. SwiftDate — 最强大的工具

SwiftDate(作者:Daniele Margutti)实际上是Swift中日期处理的事实标准。包括:

  • 自动检测格式的字符串解析。
  • 日期操作(添加/减去组件)。
  • 以任意单位计算差值。
  • 本地化(支持30+种语言)。
  • 时区和日历处理。


安装:通过SPM或CocoaPods。



示例:解析未知格式的字符串

import SwiftDate

let dateString = "2025-02-18T14:30:00+03:00"if let date = dateString.toDate() { print(date.year) // 2025 print(date.month) // 2 print(date.toFormat("dd MMMM yyyy", locale: Locales.russian)) // "18 февраля 2025"}


示例:获取人类可读的时间间隔

let start = DateInRegion(Date())let end = start + 2.hours + 30.minuteslet interval = start.toRelativeString(end, style: RelativeFormatter.defaultStyle())print(interval) // "2 hours 30 minutes later"


SwiftDate还可以处理

推荐