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

86

Je sais que la suite de fonctionnalités NSDateformatter est une aubaine pour l'humanité, mais en même temps c'est très déroutant 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 manière de procéder? Cela semble un peu verbeux.

Sjakelien
la source
1
vous pourriez remplacer MMMM par LLLL
Peter Stajger

Réponses:

162

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 puisque monthSymbols est basé sur zéro.


la source
2
Documentation pour monthSymbols: developer.apple.com/library/mac/#documentation/Cocoa/Reference/…
Firecall
14
Cela fonctionne uniquement avec les paramètres régionaux anglais (et les langues similaires). Cela ne fonctionne pas avec les locales pour les langues qui utilisent des cas, par exemple les langues slaves. standaloneMonthSymbolsdoit être utilisé.
Sulthan
5
Simplification:NSString *monthName = [[[NSDateFormatter alloc] init] monthSymbols][monthNumber-1];
Johannes Fahrenkrug
7
S'il vous plaît, utilisez standaloneMonthSymbols
Roman Truba
1
À utiliser [df shortMonthSymbols]si vous voulez des noms de mois courts (janvier, février ...).
Shobhit C
36

Swift 2.0

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

Swift 4.0

let monthName = DateFormatter().monthSymbols[monthNumber - 1]
émouvant
la source
24

Vous pouvez modifier le dateFormat du NSDateFormatter. Alors 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

Carl
la source
13

La meilleure solution pour cela est, la standaloneMonthSymbolsméthode,

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

    NSArray *monthNames = [formate standaloneMonthSymbols];

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

    return monthName;
}
Nico
la source
10

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];
Pascal
la source
8

Les deux réponses d'Anna Karenina et de Carl ne fonctionnent pas très 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 monthSymbolspar standaloneMonthSymbols)

serbe
la source
6

Dans Swift 3.0

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

    // result
   "March\n"        
Heshan Sandeepa
la source
2
Mieux vaut utiliser standaloneMonthSymbolspour corriger la casse dans certaines langues
Gleb Tarasov
6

Swift 4.X

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

Par exemple:

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

Production

novembre

Ashu
la source
3

NSDate à 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, 13 h 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);
PradeepKN
la source
1

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)];
}
Kevin Delord
la source
0

Vous devriez être en mesure de vous débarrasser de la publication et de la réattribution de dateFormatter, en supprimant quelques lignes, mais c'est tout ce que je vois.

Matthieu Frederick
la source