Swift4获取CEST时区时间异常:CEST标识失效、CET标识正常
解决Swift 4中获取中欧夏令时(CEST)时间的问题
嘿,这个坑我之前也踩过!问题出在时区标识符的选择规范上,我来给你拆解清楚:
为什么用"CEST"会得到UTC时间?
TimeZone(Foundation框架里的类)并不推荐使用像CEST、CET这类时区缩写来初始化时区。这些缩写只是时区的别名,不是标准的Olson时区标识符(也就是Continent/City格式的地区性标识符)。当你传入"CEST"时,系统无法将它识别为一个有效独立时区,直接 fallback 到了UTC,所以得到的时间完全不符合预期。
为什么用"CET"反而正常?
其实用"CET"也不是严谨的做法,但系统对这个缩写的兼容性稍好一些——它会自动根据当前日期判断是夏令时(CEST)还是冬令时(CET),所以看起来结果是对的。但这种方式不可靠,因为缩写可能存在歧义(不同地区可能用同一个缩写),而且系统对缩写的支持随时可能变化。
正确的实现方式:使用地区性时区标识符
想要稳定获取中欧时区的时间,不管是夏令时还是冬令时,都应该用Olson时区标识符,也就是以Continent/City格式命名的标识符,中欧常用的有:
Europe/Berlin(德国柏林时区)Europe/Paris(法国巴黎时区)Europe/Vienna(奥地利维也纳时区)
这些标识符会让系统自动处理夏令时的切换,始终返回正确的当地时间。
示例代码
import Foundation let dateFormatter = DateFormatter() dateFormatter.dateFormat = "HH:mm" // 这里选择中欧时区的标准标识符,比如柏林时区 dateFormatter.timeZone = TimeZone(identifier: "Europe/Berlin") // 获取当前时间并格式化 let currentCESTTime = dateFormatter.string(from: Date()) print("当前中欧时间:\(currentCESTTime)")
小技巧:查看所有可用的时区标识符
如果不确定自己需要的时区对应哪个标识符,可以打印所有可用的标识符列表:
print(TimeZone.knownTimeZoneIdentifiers)
从中筛选出符合你需求的中欧地区时区即可。
内容的提问来源于stack exchange,提问作者iKK
相关产品推荐
相关产品推荐

