Swift 中子字符串检查:含代码示例的完整指南

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

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

开始课程

时间是个棘手的东西:为什么 Swift 开发者会抓狂

\n\n

你是否曾经发送过一条推送通知,结果在凌晨 3 点才到达用户手机?或者为国际团队计算了一个截止日期,却发现它整整差了一天?欢迎来到时区的世界——这是编程领域中,一个字符串里少了个 'Z' 就能毁掉你整个应用逻辑的地方。

\n\n

在 Swift 中,处理时区不仅仅是调用 Date() 那么简单。这是一个完整的类生态系统:Date、TimeZone、DateFormatter、Calendar 和 DateComponents。如果你一开始没搞清楚它们,你的项目就会变成一个噩梦般的 Bug 集合,而且这些 Bug 只会在特定地区的用户那里重现。

\n\n

在本文中,我们将深入解析 Swift 中的时区处理:从简单的格式化到夏令时转换的复杂场景。你将学会如何避免 UTC 搞砸,理解为什么 Date 只是一个时间戳,以及如何让你的应用在世界任何地方都能正确运行。

\n\n

Swift 中的 Date:初学者最容易踩的坑

\n\n

第一件要记住的事:Swift 中的 Date 既不是日期也不是时间。它只是自 2001 年 1 月 1 日 00:00:00 UTC(参考日期)以来经过的秒数。Date 本身对时区或日历一无所知。它是一个绝对的时间戳。

\n\n

下面是一个经典的初学者错误:

\n\n
let now = Date()\nprint(now) // "2025-03-15 14:30:00 +0000" — 这是 UTC,不是你的本地时间!\n
\n\n

当你将 Date 打印到控制台时,Xcode 会以 UTC 显示它。但用户看到的是他们自己时区的时间。问题在于许多初学者认为 Date 已经“知道”他们的本地时间。不,Date 只是一个数字。其他一切都是解释。

\n\n

如何正确获取目标时区的当前时间

\n\n

要处理“人类可读”的时间,你需要使用 DateFormatter 和 TimeZone。这是一个最小的工作示例:

\n\n
let dateFormatter = DateFormatter()\ndateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"\ndateFormatter.timeZone = TimeZone(identifier: "Europe/Moscow")\n\nlet now = Date()\nlet moscowTime = dateFormatter.string(from: now)\nprint("莫斯科当前时间:\\(moscowTime)")\n
\n\n

记住这条规则:用 UTC 存储日期,用本地时区显示。如果你将像 '2025-03-15 14:30:00' 这样的字符串保存到数据库而不指定时区,你就是在埋下一颗定时炸弹。始终添加偏移量,或者使用带 'Z' 或 '+03:00' 后缀的 ISO 8601 格式。

\n\n

TimeZone:你的主要帮手和敌人

\n\n

Swift 中的 TimeZone 类是 IANA 时区数据库(Olson 数据库)的接口。它存储了关于夏令时转换、历史变化和地理时区的信息。

\n\n

创建 TimeZone 最常用的方法:

\n\n
    \n
  • 按标识符(推荐):TimeZone(identifier: "America/New_York")
  • \n
  • 按缩写(不可靠):TimeZone(abbreviation: "EST") — 可能会混淆夏令时/冬令时
  • \n
  • 按相对于 GMT 的偏移:TimeZone(secondsFromGMT: 10800) — 忽略夏令时
  • \n
  • 当前系统时区:TimeZone.current
  • \n
\n\n

下面是一个例子,说明为什么缩写是有害的:

\n\n
let est = TimeZone(abbreviation: "EST") // 东部标准时间 (UTC-5)\nlet edt = TimeZone(abbreviation: "EDT") // 东部夏令时 (UTC-4)\n\n// 但是如果你在 7 月使用 EST,你会得到错误的时间!\n// 始终使用 "America/New_York" — 它会自动处理夏令时\n
\n\n

始终使用 IANA 标识符——它们会考虑历史记录和夏令时转换。这对于应用来说至关重要,

博客

书籍推荐