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

це спосіб зробити це? Це здається трохи багатослівним.


1
ви можете замінити MMMM на LLLL
Пітер Стайгер

Відповіді:


162

Інший варіант - використовувати метод monthSymbols:

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

Зверніть увагу, що вам потрібно буде відняти 1 із вашого 1..12 місяцяNumber, оскільки monthSymbols базується на нулі.


2
Документація за місяць Symbols: developer.apple.com/library/mac/#documentation/Cocoa/Reference/…
firecall

14
Це насправді працює лише з англійською мовою (та подібними мовами). Це не працює з локалями для мов, які використовують регістри, наприклад, слов’янські мови. standaloneMonthSymbolsповинні бути використані.
Султан

5
Спрощення:NSString *monthName = [[[NSDateFormatter alloc] init] monthSymbols][monthNumber-1];
Йоханнес Фаренкруг,

7
Будь ласка, використовуйте standaloneMonthSymbols
Роман Труба

1
Використовуйте, [df shortMonthSymbols]якщо хочете короткі назви місяців (січень, лютий ...).
Shobhit C

36

Свіфт 2.0

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

Свіфт 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

Обидві відповіді від Анни Кареніної та Карла працюють не так добре, оскільки вони не повернуть ім'я місяця в номінативі для деяких культур. Я пропоную скористатися запропонованим рішенням від Pascal, який вирішує цю проблему (замінивши 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

Свіфт 4.X

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

Наприклад:

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

Вихідні дані

Листопад


3

NSDate to 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 to NSString -> As Dateformat Ex: 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);

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, вирізавши пару рядків, але це все, що я бачу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.