iOS: Как получить правильное название месяца из числа?

86

Я знаю, что набор функций NSDateformatter является благом для человечества, но в то же время меня очень сбивает с толку. Я надеюсь, ты сможешь мне помочь.

Где-то в моем коде есть int, представляющий месяц. Итак: 1 будет января, 2 февраля и т. Д.

В моем пользовательском интерфейсе я хотел бы отображать это целое число как собственное название месяца. Причем он должен соответствовать региону устройства.

Спасибо за понимание

Тем временем я сделал следующее:

int monthNumber = 11
NSString * dateString = [NSString stringWithFormat: @"%d", monthNumber];

NSDateFormatter* dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"MM"];
NSDate* myDate = [dateFormatter dateFromString:dateString];
[dateFormatter release];

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"MMMM"];
NSString *stringFromDate = [formatter stringFromDate:myDate];
[formatter release];

это способ сделать это? Это кажется многословным.

Sjakelien
источник
1
вы можете заменить MMMM на LLLL
Peter Stajger

Ответы:

162

Другой вариант - использовать метод monthSymbols:

int monthNumber = 11;   //November
NSDateFormatter *df = [[[NSDateFormatter alloc] init] autorelease];
NSString *monthName = [[df monthSymbols] objectAtIndex:(monthNumber-1)];

Обратите внимание, что вам нужно вычесть 1 из вашего 1..12 monthNumber, поскольку monthSymbols отсчитывается от нуля.


источник
2
Документация на месяц Символы: developer.apple.com/library/mac/#documentation/Cocoa/Reference/…
firecall 02
14
На самом деле это работает только с английской локалью (и подобными языками). Он не работает с локали для языков, которые используют варианты, например, славянские языки. standaloneMonthSymbolsдолжны быть использованы.
Sulthan
5
Упрощение:NSString *monthName = [[[NSDateFormatter alloc] init] monthSymbols][monthNumber-1];
Йоханнес Фаренкруг
7
Пожалуйста, используйте standaloneMonthSymbols
Роман Труба
1
Используйте, [df shortMonthSymbols]если вам нужны короткие названия месяцев (январь, февраль ...).
Shobhit C
36

Swift 2.0

let monthName = NSDateFormatter().monthSymbols[monthNumber - 1]

Swift 4.0

let monthName = DateFormatter().monthSymbols[monthNumber - 1]
неприятный
источник
24

Вы можете изменить dateFormat NSDateFormatter. Итак, чтобы упростить ваш код:

int monthNumber = 11
NSString * dateString = [NSString stringWithFormat: @"%d", monthNumber];

NSDateFormatter* dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"MM"];
NSDate* myDate = [dateFormatter dateFromString:dateString];

[formatter setDateFormat:@"MMMM"];
NSString *stringFromDate = [formatter stringFromDate:myDate];
[dateFormatter release];

Вы также должны установить языковой стандарт после запуска средства форматирования даты.

dateFormatter.locale = [NSLocale currentLocale]; // Or any other locale

Надеюсь это поможет

Карл
источник
13

Лучшее решение для этого - standaloneMonthSymbolsметод,

-(NSString*)MonthNameString:(int)monthNumber
{
    NSDateFormatter *formate = [NSDateFormatter new];

    NSArray *monthNames = [formate standaloneMonthSymbols];

    NSString *monthName = [monthNames objectAtIndex:(monthNumber - 1)];

    return monthName;
}
Нико
источник
10

Как насчет:

NSUInteger i = <your month integer>;
NSDateFormatter *df = [NSDateFormatter new];
// change locale if the standard is not what you want
NSArray *monthNames = [df standaloneMonthSymbols];
NSString *monthName = [monthNames objectAtIndex:(i - 1)];
[df release];
Паскаль
источник
8

Оба ответа от Анны Карениной и Карла не работают так хорошо, поскольку они не возвращают название месяца в номинальном для некоторых культур. Предлагаю использовать предлагаемое решение от Паскаля, которое решает эту проблему (заменой monthSymbolsна standaloneMonthSymbols)

серб
источник
6

В Swift 3.0

    let monthNumber = 3
    let fmt = DateFormatter()
    fmt.dateFormat = "MM"
    let month = fmt.monthSymbols[monthNumber - 1]
    print(month)

    // result
   "March\n"        
Хешан Сандипа
источник
2
Лучше использовать standaloneMonthSymbolsдля правильного регистра в некоторых языках
Глеб Тарасов
6

Swift 4.X

print((DateFormatter().monthSymbols[month-1].capitalized)) //month is int less than 12

Например:

print((DateFormatter().monthSymbols[11-1].capitalized))

Выход

Ноябрь

Ашу
источник
3

NSDate в NSString -> As Dateformat Ex: 2015/06/24

        NSDateFormatter *dateformate=[[NSDateFormatter alloc]init];
        [dateformate setDateFormat: @"yyyy/MM/dd"];
        NSString *date = [dateformate stringFromDate:selectedDate]; // Convert date to string

NSDate в NSString -> As Dateformat Пример: 24 июня 2015 г., 13:02

        [dateformate setDateFormat:@"yyyy MMMM dd, h:mm a"];
        NSString *displayDate = [dateformate stringFromDate:selectedDate]; // Convert date to string
        NSLog(@"date :%@",date);
        NSLog(@"Display time = %@", displayDate);
PradeepKN
источник
1

И с ARC:

+ (NSString *)monthNameFromDate:(NSDate *)date {
    if (!date) return @"n/a";
    NSDateFormatter *df = [[NSDateFormatter alloc] init];
    [df setDateFormat:@"MM"];
    return [[df monthSymbols] objectAtIndex:([[df stringFromDate:date] integerValue] - 1)];
}
Кевин Делорд
источник
0

Вы сможете избавиться от выпуска и перераспределения dateFormatter, вырезав пару строк, но это все, что я вижу.

Мэтью Фредерик
источник