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.


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.



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]

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


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

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

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)


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"        

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


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

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

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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.