iOS 15.4 12小时制 时间格式转换崩溃

线上反馈更新15.4版本后崩溃,通过反馈上来的截图来看,都是12小时制的时间格式,

更新了最新版XCode之后,发现模拟器默认的时间制式为12小时,但没有发生崩溃情况;

因此我将测试机更新至了15.4版本,并使用12小时制进行测试。发现问题代码如下

       let dfmatter = DateFormatter()

        dfmatter.dateFormat = “yyyy/MM/dd HH:mm:ss”

        let date = dfmatter.date(from: "2020/02/02 17:22:38")

        let dateStamp:TimeInterval = date!.timeIntervalSince1970

复制代码

261647686109_.pic.jpg

此段时间格式转换代码反馈的date为nil,导致了崩溃;

这里首先发现了一个代码规范的问题,本来可以不强解,就不会导致系统崩溃的。因为这段代码也用了6年了,从OC迁移来Swift的,一般不会造成崩溃,就没多想直接使用了强解,没想到在15.4版本中跌入坑中。

下来在看是为什么会导致其为nil的,

我将当前时间戳按照“yyyy-MM-dd HH:mm:ss”的转换格式在真机设备上运行 打印如下

iOS15.4

  • 12小时制 2020/02/02 下午5:22:38

  • 24小时制 2020/02/02 17:22:38

其他系统版本

  • 12小时制 2020/02/02 17:22:38

  • 24小时制 2020/02/02 17:22:38

打印出了 dateformat对象的参数

271647686109_.pic.jpg

应该是在DateFormat()在iOS15.4的系统版本进行了修改,所以出现这种异常情况。

查阅了开发者文档,发现一个技术问答中的情况类似

-   在 iOS 上,用户可以覆盖默认的 AM/PM 与 24 小时时间设置(通过设置 > 常规 > 日期和时间 > 24 小时时间),这会导致 NSDateFormatter 重写您设置的格式字符串,这可能会导致您的时间解析失败。
复制代码

附开发者文档:developer.apple.com/library/arc…

尝试加上local后,再次运行就会解析正常。

但是很奇怪的是,打印出来的dateformat中的local中是“zh_CN”格式。

最后附上可正常解析的代码:

       let dfmatter = DateFormatter()

        dfmatter.dateFormat = “yyyy/MM/dd HH:mm:ss”
        
        dfmatter.locale = Locale(identifier: "zh_CN")

        let date = dfmatter.date(from: "2020/02/02 17:22:38")

        let dateStamp:TimeInterval = date!.timeIntervalSince1970

复制代码

猜你喜欢

转载自juejin.im/post/7077493937383948295