Swift:设置本地时区后Date对象输出UTC时间的疑问
嘿,我来帮你理清这个Date和DateFormatter的时区问题——这其实是很多iOS开发者刚接触时会踩的典型坑~
第一个问题:为什么设置了TimeZone.current,输出的Date还是带+0000?
核心要先搞懂一个关键:Date对象本身根本不存储时区信息。它本质上就是一个时间戳,代表“自1970年1月1日UTC零点以来的秒数”,是一个绝对的、全球统一的时间点。
你设置dateFormatter.timeZone = TimeZone.current,作用是告诉格式化器:在解析字符串"05/21/18"的时候,把这个日期当作当前时区的0点来处理。比如你身处PDT时区(UTC-7),那么本地时区的2018-05-21 00:00,对应的UTC时间就是2018-05-21 07:00——这就是你打印出来的结果。
而print(todayDate)时,系统默认会把Date转换成UTC格式的字符串展示,所以你看到的是+0000,这和DateFormatter的时区设置完全无关,只是Date默认的打印规则而已。
第二个问题:为什么字符串转回去的Date看起来差异大?
这依然是“显示格式”和“实际时间点”的混淆:
- 你用
dateFormatter.string(from: Date())生成的字符串05/21/18 19:29:19 PDT,是当前时区(PDT)下的本地时间展示。 - 当你用同一个
DateFormatter解析这个字符串时,它会正确识别PDT时区标记,把这个本地时间转换成对应的UTC时间点:PDT是UTC-7,所以19:29加上7小时就是次日02:29,也就是你打印的2018-05-22 02:29:19 +0000。
本质上,这个Date和你调用Date()时获取的时间是同一个时间点,只是前者用UTC格式打印,后者用本地时区字符串展示而已。
验证小技巧
如果想确认两个时间点一致,可以用时间差来验证:
let now = Date() let dateString = dateFormatter.string(from: now) let todayDate = dateFormatter.date(from: dateString)! print(now.timeIntervalSince(todayDate)) // 输出接近0的数值,说明是同一个时间点
另外,如果想让Date按照本地时区格式打印,别直接print(Date),而是用DateFormatter再转一次:
let displayFormatter = DateFormatter() displayFormatter.dateFormat = "MM/dd/yy HH:mm:ss z" displayFormatter.timeZone = TimeZone.current print(displayFormatter.string(from: todayDate)) // 会输出你预期的本地时区时间
内容的提问来源于stack exchange,提问作者August
相关产品推荐
相关产品推荐

