NSDateFormatter 不支持长格式的日期周期('b' 或 'B')

NSDateFormatter doesn't support long-form day periods ('b' or 'B')

NSDateFormatter 似乎无法使用 'B' 或 'b' 格式说明符。 'B' 有点像 'a' (am/pm),但它输出类似 "at night" 或 "in the morning".

的东西

例如,这段代码:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
NSLocale* locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en-US"];
NSString *dateTemplate = [NSDateFormatter dateFormatFromTemplate:@"h:mmB" 
                                                         options:0 
                                                         locale:locale];
[dateFormatter setDateFormat:dateTemplate];
[dateFormatter setLocale:locale];
NSString* now = [dateFormatter stringFromDate:[NSDate date]];

NSLog(@"String:\t%@\ndateTemplate:\t%@", 
      now,
      dateFormatter.dateFormat);

...打印这个:

String: 10:23 PM         // Should be "10:23 at night"
dateTemplate:   h:mm a   // Note that 'B' turned into 'a' (am/pm)

跳过 dateFormatFromTemplate 并将格式直接放入格式化程序具有相同的效果。

The docs say that iOS 7 and later use tr35-31. It's unclear whether that spec supports 'B'. The formatting table for version 31 mentions 'a', but does not mention 'B'. On the other hand, the spec for all of tr35 确实提到了 'B'.

如果您下载版本 31 的 actual CLDR data,您可以找到 "in the evening" 等的 dayPeriod 条目。

数据存在;是否有其他格式化字符串可以用来获得更长的 "day period" 字符串?

我可以在 Xcode 9 的 iOS 操场上使用它。抱歉,下面的代码在 Swift 中,但它似乎确实有效对我来说。

let loc = Locale(identifier: "en-US")
let testDF = DateFormatter()
testDF.dateFormat = "MM-dd-yyyy HH:mm"
testDF.locale = loc

let df = DateFormatter()
df.dateFormat = "h:mm B"
df.locale = loc
df.string(from: testDF.date(from: "09-21-2018 17:22")!)  // "5:22 in the afternoon"
df.string(from: testDF.date(from: "09-21-2018 19:22")!)  // "7:22 in the evening"
df.string(from: testDF.date(from: "09-21-2018 22:22")!)  // "10:22 at night"
df.dateFormat  // "h:mm B"

B 用于 "natural language" 日期描述是正确的。但是,您遇到的问题是由在日期格式模板中使用它引起的。

当您要求 CLDR 本地化模板格式时,它似乎无法识别它应该将 B 保留在日期格式字符串中。因此,它将 a 替换回最终格式字符串。

顺便说一句,如果您 运行 到 +[NSLocale availableLocaleIdentifiers],您会发现 任何 语言环境都支持 B模板字符串。

但是,如果您直接在日期格式字符串中使用 B,那么它会按预期工作:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
dateFormatter.dateFormat = @"h:mm B";
NSLog(@"%@", [dateFormatter stringFromDate:[NSDate date]]);

输出:

12:57 in the afternoon