NSDateFormatter не поддерживает длинные дневные периоды («b» или «B») - PullRequest
0 голосов
/ 21 сентября 2018

NSDateFormatter не может использовать спецификаторы формата 'B' или 'b'.'B' немного похоже на 'a' (am / pm), но выводит такие вещи, как "ночью" или "утром".

Например, этот код:

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 и помещение формата непосредственно в форматтер имеет тот же эффект.

Документы говорят, что iOS7 и позже используйте tr35-31.Неясно, поддерживает ли эта спецификация 'B'.Таблица форматирования для версия 31 упоминает «a», но не упоминает «B».С другой стороны, в спецификации для всех tr35 действительно упоминается буква B.

Если вы скачаете фактические данные CLDR для версии 31, вы можете найтизаписи dayPeriod для "вечером" и т. д.

Данные существуют;есть ли другая строка форматирования, которую я могу использовать, чтобы получить более длинные строки «дневной период»?

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Вы правы, что B используется для описания "естественного языка" дневного периода.Однако проблема, с которой вы столкнулись, возникает из-за использования его в шаблоне формата даты.

Может показаться, что 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
0 голосов
/ 21 сентября 2018

Я могу заставить его работать на игровой площадке iOS в Xcode 9. Извините, приведенный ниже код написан на 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"
...