Как я могу получить день недели и / или название месяца из переменной NSDate? - PullRequest
35 голосов
/ 08 апреля 2011

Хорошо. Проблема в том, что у нас есть NSStrings, заполненные датами в формате yyyyMMdd, и мы хотим получить текущий день недели и название месяца. Функция dagOmvandlare преобразует строку даты в день недели и месяц. Затем вызывается функция 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 ]

84 голосов
/ 08 апреля 2011

Нет необходимости вручную переводить слова на шведские. 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
11 голосов
/ 05 октября 2016

Расширения Simple 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
9 голосов
/ 08 апреля 2011
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);
5 голосов
/ 08 апреля 2011

Надеюсь, это поможет

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?

1 голос
/ 20 марта 2017

Как говорит 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 будет хорошим.(мы не можем использовать переменные в расширениях ... :( глобальные переменные кажутся плохими, но никак ...)

1 голос
/ 27 сентября 2013
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"EEEE"];
NSString *dayName = [dateFormatter stringFromDate:Date];

this dayName будет доступно в локали пользователя.

0 голосов
/ 03 июня 2016
- (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]]);

}
...