You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS开发:如何始终获取午夜时刻的日期?

解决获取午夜时刻的时区问题

我来帮你理清这个问题~你遇到的核心问题其实是时区转换的显示迷惑,以及没有明确区分「UTC时区的午夜」和「用户当地时区的午夜」两种需求,下面分两种情况给你最简解决方案:

1. 获取UTC时区的午夜时刻(即你期望的2019-08-08 00:00:00 +0000)

你之前的代码把Calendar的时区设成了用户当前时区,所以startOfDay计算的是用户当地的凌晨,转换到UTC就变成了前一天的22:00(说明你所在时区是UTC+2)。要得到UTC时区的午夜,只需要把Calendar的时区指定为UTC即可:

var calendar = Calendar.current
calendar.timeZone = TimeZone(identifier: "UTC")!
let utcMidnight = calendar.startOfDay(for: Date())
// 此时utcMidnight就是当前日期对应的UTC 00:00:00 +0000

2. 获取用户当地时区的午夜时刻

其实你原来的代码逻辑是对的!你看到的2019-08-08 22:00:00 +0000只是UTC格式的输出,而当地时间确实是午夜。如果你想验证,可以用DateFormatter按当地时区格式化输出:

// 最简写法:Calendar默认就是当前时区,无需手动设置
let localMidnight = Calendar.current.startOfDay(for: Date())

// 验证当地时间
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd HH:mm:ss Z"
formatter.timeZone = TimeZone.current
print(formatter.string(from: localMidnight)) // 会显示你当地时区的00:00:00

简单总结:

  • 要UTC午夜:给Calendar设置UTC时区后调用startOfDay
  • 要当地午夜:直接用默认Calendar的startOfDay,记得用当地时区的格式化工具查看结果,别被UTC输出误导

内容的提问来源于stack exchange,提问作者mahan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:32:17