Как получить день недели и / или название месяца из переменной NSDate?
Хорошо. Проблема, с которой мы столкнулись, заключается в том, что у нас есть шнурки, заполненные датами в формате yyyyMMdd и то, что мы хотим сделать, это получить текущий день недели и название месяца. Функция dagOmvandlare преобразует datestring в день недели и месяц. Затем функция вызывается на viewDidload, чтобы назвать все наши названия кнопок от английского до шведского месяцев.
Наше текущее решение выглядит следующим образом:
-(NSString *)dagOmvandlare:(id) suprDatum{
NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
dateFormatter.dateFormat = @"yyyyMMdd";
NSDate *date = [dateFormatter dateFromString:suprDatum];
NSString * monthString = [date descriptionWithCalendarFormat:@"%B"timeZone:nil
locale:[[NSUserDefaults standardUserDefaults] dictionaryRepresentation]];
if ([monthString isEqualToString:@"January"]) {
monthString = @"Januari";
}
else
if ([monthString isEqualToString:@"February"]) {
monthString = @"Februari";
}
else
if ([monthString isEqualToString:@"May"]) {
monthString = @"Maj";
}
else
if ([monthString isEqualToString:@"June"]) {
monthString = @"Juni";
}
else
if ([monthString isEqualToString:@"July"]) {
monthString = @"Juli";
}
else
if ([monthString isEqualToString:@"August"]) {
monthString = @"Augusti";
}
else
if ([monthString isEqualToString:@"October"]) {
monthString = @"Oktober";
}
else
if ([monthString isEqualToString:@"March"]) {
monthString = @"Mars";
}
return monthString;
}
- (void)viewDidLoad {
[super viewDidLoad];
[button3 setTitle:(NSString *)[self dagOmvandlare:self.datum1] forState:UIControlStateNormal];
[button2 setTitle:(NSString *)[self dagOmvandlare:self.datum2] forState:UIControlStateNormal];
[bmanad1 setTitle:(NSString *)[self dagOmvandlare:self.datum3] forState:UIControlStateNormal];
}
И то, что мы выяснили до сих пор, это то, что
NSString * monthString = [date descriptionWithCalendarFormat:@"%B"timeZone:nil
locale:[[NSUserDefaults standardUserDefaults] dictionaryRepresentation]];
Не разрешается использовать директивами Apple в отношении непубличных api. поэтому основной вопрос заключается в том, каким еще образом можно получить день недели и название месяца из наших наборов данных, содержащих даты в формате yyyyMMdd ?
7 ответов:
Нет необходимости вручную преобразовывать в шведские слова. iPhone сделает это за вас. Попробуйте это:
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; dateFormatter.dateFormat = @"yyyyMMdd"; NSDate *date = [dateFormatter dateFromString:@"20111010"]; // set swedish locale dateFormatter.locale=[[NSLocale alloc] initWithLocaleIdentifier:@"sv_SE"]; dateFormatter.dateFormat=@"MMMM"; NSString *monthString = [[dateFormatter stringFromDate:date] capitalizedString]; NSLog(@"month: %@", monthString); dateFormatter.dateFormat=@"EEEE"; NSString *dayString = [[dateFormatter stringFromDate:date] capitalizedString]; NSLog(@"day: %@", dayString);
Вывод:
month: Oktober day: Måndag
Простые расширения Swift 3:
// Weekday extension Date { func dayOfWeek() -> String? { let dateFormatter = DateFormatter() dateFormatter.dateFormat = "EEEE" return dateFormatter.string(from: self).capitalized // or capitalized(with: locale) } } print(Date().dayOfWeek()!) // Wednesday // Month Name extension Date { func monthName() -> String? { let dateFormatter = DateFormatter() dateFormatter.dateFormat = "MMMM" return dateFormatter.string(from: self).capitalized // or capitalized(with: locale) } } print(Date().monthName()!) // October
NSString *strDate=@"20110407"; NSDateFormatter *df=[[[NSDateFormatter alloc] init] autorelease]; [df setDateFormat:@"yyyyMMdd"]; NSDate *targetDate=[df dateFromString:strDate]; [df setDateFormat:@"EEEE MMMM dd, yyyy"]; NSString *s=[df stringFromDate:targetDate]; NSLog(@"Date: %@", s);
Надеюсь, это поможет
NSCalendar *calendar= [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; NSCalendarUnit unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit; NSDate *date = [NSDate date]; NSDateComponents *dateComponents = [calendar components:unitFlags fromDate:date]; NSInteger year = [dateComponents year]; NSInteger month = [dateComponents month]; NSInteger day = [dateComponents day]; NSInteger hour = [dateComponents hour]; NSInteger minute = [dateComponents minute]; NSInteger second = [dateComponents second]; [calendar release];
Это может быть полезно
Еще один вопрос SO, который может помочь вам Как найти день недели с сегодняшней даты, используя NSDate?
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"EEEE"]; NSString *dayName = [dateFormatter stringFromDate:Date];
Это имя дня будет доступно в локали пользователя.
Как говорит apple, создание (и пусть ARC утилизирует) форматера дорого, поэтому:
1) объявите в своем файле:
private var localDateFormatter : DateFormatter? .. extension Date {
2) Используйте ленивый подход:
if localDateFormatter == nil{ localDateFormatter = DateFormatter() let locale = Locale(identifier: "en_US_POSIX") ....} let newTime = localDateFormatter!.date(from: self)
Если у вас есть все вещи в одном классе, статический / let-член был бы хорош. (мы не можем использовать vars в расширениях... : (глобалы кажутся плохими, но никак...)
- (void) getMonthFromDate:(NSString *) stringDate { NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; [dateFormat setDateFormat:@"yyyy-MM-dd"]; NSDate *date = [dateFormat dateFromString:stringDate]; NSCalendar* calendar = [NSCalendar currentCalendar]; NSDateComponents* components = [calendar components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay fromDate:date]; // Get necessary date components NSLog(@"%lu", [components day]); NSLog(@"%lu %@",[components day],[[dateFormat monthSymbols] objectAtIndex:[components month]]); }