Je sais que la suite de fonctionnalités NSDateformatter est une aubaine pour l'humanité, mais en même temps, elle est très déroutante pour moi. J'espère que vous pourrez m'aider.
Quelque part dans mon code, il y a un int représentant un mois. Donc: 1 serait janvier, 2 février, etc.
Dans mon interface utilisateur, je voudrais afficher cet entier comme nom de mois approprié. De plus, il doit respecter les paramètres régionaux de l'appareil.
Nous vous remercions de vos idées
En attendant, j'ai fait ce qui suit:
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];
est-ce la façon de procéder? Cela semble un peu verbeux.
Une autre option consiste à utiliser la méthode monthSymbols:
int monthNumber = 11; //November
NSDateFormatter *df = [[[NSDateFormatter alloc] init] autorelease];
NSString *monthName = [[df monthSymbols] objectAtIndex:(monthNumber-1)];
Notez que vous devrez soustraire 1 de votre 1..12 monthNumber car monthSymbols est basé sur zéro.
Swift 2.
let monthName = NSDateFormatter().monthSymbols[monthNumber - 1]
Swift 4.
let monthName = DateFormatter().monthSymbols[monthNumber - 1]
Vous pouvez modifier la dateFormat de NSDateFormatter. Donc pour simplifier votre code:
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];
Vous devez également définir les paramètres régionaux une fois que vous avez lancé le formateur de date.
dateFormatter.locale = [NSLocale currentLocale]; // Or any other locale
J'espère que cela t'aides
La meilleure solution est la méthode standaloneMonthSymbols
,
-(NSString*)MonthNameString:(int)monthNumber
{
NSDateFormatter *formate = [NSDateFormatter new];
NSArray *monthNames = [formate standaloneMonthSymbols];
NSString *monthName = [monthNames objectAtIndex:(monthNumber - 1)];
return monthName;
}
Que diriez-vous:
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];
Les deux réponses d'Anna Karenina et Carl ne fonctionnent pas aussi bien car elles ne renverront pas le nom du mois en nominatif pour certaines cultures. Je suggère d'utiliser la solution proposée par Pascal, qui résout ce problème (en remplaçant monthSymbols
par standaloneMonthSymbols
)
Dans Swift 3.
let monthNumber = 3
let fmt = DateFormatter()
fmt.dateFormat = "MM"
let month = fmt.monthSymbols[monthNumber - 1]
print(month)
// result
"March\n"
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 juin 2015, 13h02
[dateformate setDateFormat:@"yyyy MMMM dd, h:mm a"];
NSString *displayDate = [dateformate stringFromDate:selectedDate]; // Convert date to string
NSLog(@"date :%@",date);
NSLog(@"Display time = %@", displayDate);
Swift 4.X
print((DateFormatter().monthSymbols[month-1].capitalized)) //month is int less than 12
Par exemple:
print((DateFormatter().monthSymbols[11-1].capitalized))
Sortie
Novembre
Et avec 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)];
}
Vous devriez pouvoir vous débarrasser de la publication et de la réallocation de la dateFormatter, en supprimant quelques lignes, mais c'est tout ce que je vois.