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];
это способ сделать это? Это кажется немного многословным.
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 stringNSDate 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