将某一年的周数转换为月份名称

时间:2013-08-29 13:15:22

标签: ios cocoa-touch nsstring nsdate

在搜索SO之后但除了this question之外我找不到任何解决方案。我正在考虑创建一个接受周数int和年份int的方法,并返回一个NSString的月份名称:

- (NSString *)getMonthNameFromNumber:(int)weekNumber andYear:(int)year

但我无法找到解决这个问题的方法。如果有人可以提供建议,我们会很高兴。

2 个答案:

答案 0 :(得分:4)

这样的事情会做

- (NSString *)monthNameForWeek:(NSUInteger)week inYear:(NSInteger)year {
    NSDateComponents * dateComponents = [NSDateComponents new];
    dateComponents.year = year;
    dateComponents.weekOfYear = week;
    dateComponents.weekday = 1; // 1 indicates the first day of the week, which depends on the calendar
    NSDate * date = [[NSCalendar currentCalendar] dateFromComponents:dateComponents];
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"MMMM"];
    return [formatter stringFromDate:date];
}

请注意,这取决于设备首选项中设置的当前日历。

如果这不符合您的需求,您可以提供NSCalendar实例并使用它来检索日期,而不是使用currentCalendar。通过这样做,您可以配置诸如一周的第一天之类的事情,依此类推。 NSCalendar的{​​{3}}值得一读。

如果使用自定义日历是常见情况,只需将实现更改为

- (NSString *)monthNameForWeek:(NSUInteger)week inYear:(NSInteger)year {
     [self monthNameForWeek:week inYear:year calendar:[NSCalendar currentCalendar]];
}

- (NSString *)monthNameForWeek:(NSUInteger)week inYear:(NSInteger)year calendar:(NSCalendar *)calendar {
    NSDateComponents * dateComponents = [NSDateComponents new];
    dateComponents.year = year;
    dateComponents.weekOfYear = week;
    dateComponents.weekday = 1; // 1 indicates the first day of the week, which depends on the calendar
    NSDate * date = [calendar dateFromComponents:dateComponents];
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"MMMM"];
    return [formatter stringFromDate:date];
}

作为不相关的附注,除非您间接返回值,否则应避免使用get方法名称。

答案 1 :(得分:2)

与日期有关,您需要涉及日历。您的问题假定格里高利历,但我建议您将方法声明更改为:

- (NSString*)monthNameFromWeek:(NSInteger)week year:(NSInteger)year calendar:(NSCalendar*)cal;

从这一点来看,我们谈论的那天也存在模糊性。例如(尚未检查过),2015年第4周可能包含1月和2月。哪一个是正确的?对于这个例子,我们将使用工作日1,表示星期日(在英国公历中),我们将使用它所属的任何月份。

因此,您的代码将是:

// Set up our date components
NSDateComponents* comp = [[NSDateComponents alloc] init];
comp.year = year;
comp.weekOfYear = week;
comp.weekday = 1;

// Construct a date from components made, using the calendar
NSDate* date = [cal dateFromComponents:comp];

// Create the month string
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"MMMM"];
return [dateFormatter stringFromDate:date];