【问题标题】:Issue with NSDateFormatter, while NSDate from string with time onlyNSDateFormatter 的问题,而来自字符串的 NSDate 仅具有时间
【发布时间】:2017-02-10 10:44:30
【问题描述】:

我面临NSDateFormatter 的有线问题。

以下是我的代码:

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"hh:mma"];
NSString *currentHours = [formatter stringFromDate:[NSDate date]];
NSLog(@"Hours: %@", currentHours);

如果设备设置设置为以 12 小时显示时间(即上午和下午),则输出如下:

Hours: 12:40PM

如果设备设置设置为 24 小时输出显示时间为:

Hours: 12:41

这也影响了我的其他代码。

NSDate *open = [formatter dateFromString:@"08:00am"];
NSDate *close = [formatter dateFromString:@"05:00"];

如果设备设置设置为以 24 小时显示时间,则两个日期对象都是 nil。在 12 小时时钟设置它的工作正常的情况下。

如果有人有相同的解决方案,请告诉我。

【问题讨论】:

  • 24 小时制没有上午或下午
  • 我知道。但我的日期格式器是@"hh:mma"。
  • 我认为下面的答案会对你有所帮助

标签: ios objective-c nsdate nsdateformatter


【解决方案1】:

将格式化程序区域设置为:

formatter.locale = [NSLocale localeWithLocaleIdentifier:@"en_US_POSIX"];

但是,请注意,这将强制 a 使用英文本地化“AM”/“PM”。许多语言(包括我的)不使用后缀来表示“AM”/“PM”。

这是一个相当烦人的错误,但如果您关心本地化,您应该尊重用户设置,不要强制 12 小时与 24 小时时间。

理想情况下,您应该只设置格式化程序的样式并让它使用系统设置:

dateFormatter.dateStyle = NSDateFormatterNoStyle;
dateFormatter.timeStyle = NSDateFormatterShortStyle

【讨论】:

    【解决方案2】:

    将格式化程序的语言环境显式设置为en_US_POSIX

    formatter.locale = [NSLocale localeWithLocaleIdentifier:@"en_US_POSIX"];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-23
      • 1970-01-01
      • 2011-06-23
      • 2023-03-18
      相关资源
      最近更新 更多