web-dev-qa-db-fra.com

iOS: Comment obtenir un nom de mois correct à partir d'un numéro?

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.

78
Sjakelien

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.

153
user467105

Swift 2.

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

Swift 4.

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

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

24
Carl

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;
}
13
Nico

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

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)

8
serb

Dans Swift 3.

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

    // result
   "March\n"        
5
Heshan Sandeepa

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);
3
Pebby

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

3
Ashu

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)];
}
2
Kevin Delord

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.

0
Matthew Frederick