iOS16.5 以上12小时制/24小时制 HH/hh引起的时间计算错误

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];

用这段代码,无论手机时间设置成12/24小时制,转换时间的“时”大于12还是小于12,都不会有问题。

  • 17
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值