在搜索了 SO 但除了这个问题之外,我没有找到任何解决方案。我正在考虑创建一个方法,该方法将接受int
周数和int
年份,并返回NSString
带有月份名称的 an:
- (NSString *)getMonthNameFromNumber:(int)weekNumber andYear:(int)year
但我找不到解决这个问题的方法。如果有人可以提供建议,我会很高兴。
在搜索了 SO 但除了这个问题之外,我没有找到任何解决方案。我正在考虑创建一个方法,该方法将接受int
周数和int
年份,并返回NSString
带有月份名称的 an:
- (NSString *)getMonthNameFromNumber:(int)weekNumber andYear:(int)year
但我找不到解决这个问题的方法。如果有人可以提供建议,我会很高兴。
这样的事情会做
- (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
一读。
如果使用自定义日历是一种常见情况,只需将实现更改为类似
- (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
使用方法名称,除非您间接返回一个值。
对于与日期有关的任何事情,您都需要使用日历。您的问题假定为公历,但我建议您将方法声明更改为:
- (NSString*)monthNameFromWeek:(NSInteger)week year:(NSInteger)year calendar:(NSCalendar*)cal;
由此,我们谈论的哪一天也有歧义。例如(尚未检查),2015 年第 4 周可能同时包含一月和二月。哪一个是正确的?对于此示例,我们将使用工作日 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];