Wiem, że zestaw funkcjonalności NSDateformatter jest dobrodziejstwem dla ludzkości, ale jednocześnie jest dla mnie bardzo zagmatwany. Mam nadzieję, że możesz mi pomóc.
Gdzieś w moim kodzie jest int reprezentujący miesiąc. A więc: 1 to styczeń, 2 luty itd.
W moim interfejsie użytkownika chciałbym wyświetlić tę liczbę całkowitą jako właściwą nazwę miesiąca. Ponadto powinien być zgodny z lokalizacją urządzenia.
Dziękuję za spostrzeżenia
W międzyczasie wykonałem następujące czynności:
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];
czy to jest sposób na zrobienie tego? Wydaje się to trochę rozwlekłe.
ios
numbers
nsdateformatter
Sjakelien
źródło
źródło
Odpowiedzi:
Inną opcją jest użycie metody monthSymbols:
int monthNumber = 11; //November NSDateFormatter *df = [[[NSDateFormatter alloc] init] autorelease]; NSString *monthName = [[df monthSymbols] objectAtIndex:(monthNumber-1)];
Pamiętaj, że musisz odjąć 1 od 1..12 MonthNumber od momentu, gdy MonthSymbols jest liczony od zera.
źródło
standaloneMonthSymbols
musi być użyte.NSString *monthName = [[[NSDateFormatter alloc] init] monthSymbols][monthNumber-1];
[df shortMonthSymbols]
jeśli chcesz mieć krótkie nazwy miesięcy (styczeń, luty ...).Swift 2.0
let monthName = NSDateFormatter().monthSymbols[monthNumber - 1]
Swift 4.0
let monthName = DateFormatter().monthSymbols[monthNumber - 1]
źródło
Możesz zmienić dateFormat w NSDateFormatter. Aby uprościć kod:
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];
Należy również ustawić ustawienia regionalne po uruchomieniu programu formatującego datę.
dateFormatter.locale = [NSLocale currentLocale]; // Or any other locale
Mam nadzieję że to pomoże
źródło
Najlepszym rozwiązaniem jest
standaloneMonthSymbols
metoda,-(NSString*)MonthNameString:(int)monthNumber { NSDateFormatter *formate = [NSDateFormatter new]; NSArray *monthNames = [formate standaloneMonthSymbols]; NSString *monthName = [monthNames objectAtIndex:(monthNumber - 1)]; return monthName; }
źródło
Co powiesz na:
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];
źródło
Obie odpowiedzi od Anny Kareniny i Carla nie działają tak dobrze, ponieważ w niektórych kulturach nie podadzą nazwy miesiąca. Proponuję skorzystać z zaproponowanego rozwiązania z Pascala, który rozwiązuje ten problem (zastępując
monthSymbols
zstandaloneMonthSymbols
)źródło
W Swift 3.0
let monthNumber = 3 let fmt = DateFormatter() fmt.dateFormat = "MM" let month = fmt.monthSymbols[monthNumber - 1] print(month) // result "March\n"
źródło
standaloneMonthSymbols
do poprawnych przypadków w niektórych językachSwift 4.X
print((DateFormatter().monthSymbols[month-1].capitalized)) //month is int less than 12
Na przykład:
print((DateFormatter().monthSymbols[11-1].capitalized))
Wynik
listopad
źródło
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: 2015 24 czerwca, 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);
źródło
A z 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)]; }
źródło
Powinieneś być w stanie pozbyć się wydania i ponownego przydzielenia dateFormatter, wycinając kilka linii, ale to wszystko, co widzę.
źródło