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



Я знаю, что набор функциональных возможностей 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];


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

618   11  

11 ответов:

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

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

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

Вы можете изменить значение параметра 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

надеюсь, что это помогает

Swift 2.0

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

Swift 4.0

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

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

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

    NSArray *monthNames = [formate standaloneMonthSymbols];

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

    return monthName;
}

Как насчет:

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

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

В Swift 3.0

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

    // result
   "March\n"        

NSDate to NSString - > Как 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 - > Как Dateformat Ex:2015 24 июня, 1: 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);

и с дугой :

+ (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)];
}

Swift 4.X

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

Например:

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

выход

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

Comments

    Ничего не найдено.