La réponse de Matt Andersen est assez élaborée, tout comme celle de SDJMcHattie. Mais NSDateFormatter est assez lourd sur le cpu et si vous appelez cela 100x vous voyez vraiment l'impact, donc voici une solution combinée dérivée des réponses ci-dessus. (Veuillez noter que les réponses ci-dessus sont toujours correctes)
NSDateFormatter est complètement fou. coûteux pour créer. Créer une fois y réutiliser mais attention : il n'est pas thread safe, donc un par thread.
En supposant que self.date = [NSDate date] ;
- (NSString *)formattedDate{
static NSDateFormatter *_dateFormatter = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_dateFormatter = [[NSDateFormatter alloc] init];
_dateFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
_dateFormatter.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0];
});
_dateFormatter.dateFormat = [NSString stringWithFormat:@"h:mm a EEEE MMMM d'%@'", [self suffixForDayInDate:self.date]];
NSString *date = [_dateFormatter stringFromDate:self.date];
return date;
}
/* Le code de SDJMcHattie, c'est plus pratique que d'utiliser un tableau */.
- (NSString *)suffixForDayInDate:(NSDate *)date{
NSInteger day = [[[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] components:NSDayCalendarUnit fromDate:date] day];
if (day >= 11 && day <= 13) {
return @"th";
} else if (day % 10 == 1) {
return @"st";
} else if (day % 10 == 2) {
return @"nd";
} else if (day % 10 == 3) {
return @"rd";
} else {
return @"th";
}
}
Sortie : 15 h 11, samedi 15 août