Swift中创建当日零点与23:59时间实例的问题求助
解决Swift中获取本地当日起止时间的问题
嘿,我来帮你搞定这个本地时间的坑!你遇到的问题本质是时区差异和Date类型的特性——Date本身是UTC时间戳,直接打印会显示UTC时间,但我们需要的是对应本地时区的当日零点和结束时间。
为什么你的原代码会出现偏移?
你原来用DateFormatter转字符串再转回Date的方式,其实拿到的是本地时区零点对应的UTC时间戳,所以打印出来会有小时差(比如你在东八区的话,本地零点就是UTC的前一天23点)。而且硬凑23:59的方式不够严谨,容易漏掉毫秒级的时间条目。
正确的实现方式
用Calendar来处理是最可靠的,它会自动适配本地时区:
1. 获取本地当日零点
import Foundation let calendar = Calendar.current // 获取本地时区下的当日起始时间(零点) let todayStart = calendar.startOfDay(for: Date())
2. 获取本地当日结束时间(覆盖到最后一毫秒)
比起硬设23:59,更严谨的方式是拿次日零点减1秒,这样能覆盖全天所有时间点:
// 先计算次日零点 guard let tomorrowStart = calendar.date(byAdding: .day, value: 1, to: todayStart) else { fatalError("无法计算次日起始时间") } // 次日零点减1秒,得到当日最后一刻 let todayEnd = calendar.date(byAdding: .second, value: -1, to: tomorrowStart)!
如何正确显示本地时间?
直接打印Date实例会显示UTC时间,如果你想看到本地时区的时间,得用DateFormatter格式化输出:
let dateFormatter = DateFormatter() dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss Z" // 带时区的格式 dateFormatter.locale = Locale.current print("本地当日零点:\(dateFormatter.string(from: todayStart))") print("本地当日结束:\(dateFormatter.string(from: todayEnd))")
这样输出的就是你期望的本地时间啦,比如东八区会显示2018-01-27 00:00:00 +0800和2018-01-27 23:59:59 +0800。
内容的提问来源于stack exchange,提问作者CraneDuitre
相关产品推荐
相关产品推荐

