iOS16.5以上的版本,如果用yyy-MM-dd HH:mm:ss转换时间,则有肯能发生错误。
先上代码:
NSString * timeStr = @"2023-01-01 11:13:32";
NSDateFormatter * dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
NSDate * parkdate = [dateFormatter dateFromString:timeStr];
NSString * timeStr = @"2023-01-01 11:13:32";
NSDateFormatter * dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
NSDate * parkdate = [dateFormatter dateFromString:timeStr];
以上是原先时间转换的代码,iOS16.5 以上的手机会发生一下问题
(首先给个定义:HH:表示24小时制的“时”,hh:表示12小时制的“时”)
1.NSDateFormatter格式设置为:@"yyyy-MM-dd HH:mm:ss"
1.1.手机设置为12小时制,parkdate则算出来的结果都为空
1.2.手机设置成24小时制,parkdate则算出来的结果都是正确的
2.NSDateFormatter格式设置为:@"yyyy-MM-dd hh:mm:ss"
2.1.无论手机是24小时制还是12小时制
2.1.1.如果换算的时间的“时”小于12,例如“2023-12-01 10:55”(10小于12),则算出来的parkdate是正确的
2.1.2.如果换算的时间的“时”大于12.例如,例如“2023-12-01 16:25”(16大于12),则算出来的parkdate是空的
以上的文字有点拗口,总而言之,在苹果方还没修复这个bug之前,iOS16.5以上版本 使用原来的NSDateFormatter转换方式,最终计算的结果都有可能有差错
解决方案:
NSDateFormatter格式仍设置为:@"yyyy-MM-dd HH:mm:ss" ,还要再设置一个地区参数即可,即给时间设置一个时区
NSLocale * localeStr = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
dateFormatter.locale= localeStr;
或则
NSLocale * localeStr = [[NSLocale alloc] initWithLocaleIdentifier:@"zh_CN"];
dateFormatter.locale= localeStr;
研究发现,无论@"en_US_POSIX"和@"zh_CN"的结果都一样
最终代码为:
NSString * timeStr = @"2023-01-01 11:13:32";
NSDateFormatter * dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
NSLocale * localeStr = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
dateFormatter.locale= localeStr;
NSDate * parkdate = [dateFormatter dateFromString:timeStr];