【问题标题】:How to get the day of week from a given number如何从给定的数字中获取星期几
【发布时间】:2013-08-19 14:42:08
【问题描述】:

我想要给定数字的星期几名称,这是伪代码:

getDayStringForInt:0 = sunday
getDayStringForInt:1 = monday
getDayStringForInt:2 = tuesday
getDayStringForInt:3 = wenesday
getDayStringForInt:4 = thursday
getDayStringForInt:5 = friday
getDayStringForInt:6 = saturday

我已尝试使用以下代码,但有些东西不起作用...

- (void) setPeriodicityDayOfWeek:(NSNumber *)dayOfWeek{
    gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    dateFormatter = [[NSDateFormatter alloc] init];
    NSLocale *frLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];
    [dateFormatter setLocale:frLocale];
    [gregorian setLocale:frLocale];
    NSDate *today = [NSDate date];
    NSDateComponents *nowComponents = [gregorian components:NSYearCalendarUnit | NSWeekCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit fromDate:today];

    [nowComponents setWeekday:dayOfWeek];

    NSDate *alertDate = [gregorian dateFromComponents:nowComponents];

    [dateFormatter setDateFormat:@"EEEE"];
    NSLog(@"Day Of Week : %@ - Periodicity : %@", dayOfWeek, [dateFormatter stringFromDate:alertDate]);
    alert.periodicity = [dateFormatter stringFromDate:alertDate];

}

我的日志很奇怪:

Day Of Week : 0 - Periodicity : monday
Day Of Week : 1 - Periodicity : wenesday
Day Of Week : 2 - Periodicity : friday
Day Of Week : 3 - Periodicity : friday
Day Of Week : 4 - Periodicity : tuesday
Day Of Week : 5 - Periodicity : sunday
Day Of Week : 6 - Periodicity : sunday

有什么想法吗?任何更好的解决方案...

【问题讨论】:

  • 有一种更简单的方法来获取工作日名称。见NSDateFormatter weekdaySymbols
  • 您的语言环境不正确。如果你想要美国英语,它需要是“en_US”。首先是语言代码(小写),然后是国家代码(大写)。
  • 正确,但是 Gabriele Petronella 发现了大问题
  • 是的,我知道。但是如果你简单地使用weekdaySymbols,你的代码可以减少到3行代码。不需要NSCalendarNSDateComponentsNSDate。您只需要一个简单的NSDateFormatter,然后访问weekdaySymbols 数组即可直接从您的索引中获取工作日的名称。
  • @rmaddy 是绝对正确的,很遗憾接受的答案没有“正确”的解决方案,所以就是这样。

标签: objective-c nsdate nsdateformatter


【解决方案1】:

既然这已成为公认的答案,我也会在这里发布“正确”的解决方案。归功于 Rob 的回答。

整个事情可以简单地使用NSDateFormatter[shortWeekdaySymbols][1]方法来实现,所以完整的解决方案归结为

- (NSString *)stringFromWeekday:(NSInteger)weekday {
    NSDateFormatter * dateFormatter = [NSDateFormatter new];
    dateFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];
    return dateFormatter.shortWeekdaySymbols[weekday];
}

原答案

请注意,您将指向NSNumber 的指针传递给需要NSInteger 的方法。 编译器不会警告您,因为指针确实是整数,而不是您期望的整数。 考虑这个简单的测试:

- (void)foo:(NSInteger)a {
    NSLog(@"%i", a);
}

- (void)yourMethod {
    [self foo:@1]; // @1 is the boxed expression for [NSNumber numberWithInt:1]
}

这会打印出类似185035664 的内容,这是指针值,即当转换为NSIntegerNSNumber *

您应该在方法签名中使用[dayOfWeek integerValue] 或直接将dayOfWeek 转换为NSInteger

另外我认为你还有其他问题:来自setWeekday:的文档

设置接收方的工作日单位数。工作日单位是 数字 1 到 n,其中 n 是一周中的天数。 例如,在公历中,n 是 7,星期日是 用 1 表示

星期天是1,所以你最好也检查一下与你的代表的对应关系。

【讨论】:

【解决方案2】:
【解决方案3】:

感谢每个人,这是一个干净的回应:

/**
 *  getting the day of week string for a given day of week number
 *
 *  @param  dayOfWeekNumber 0 return sunday, 6 return saturday
 *
 *  @return a string corresponding at the given day of week.
 */
- (NSString*) getDayOfWeekStringForDayOfWeek:(NSInteger)dayOfWeek{
    return [[dateFormatter shortWeekdaySymbols] objectAtIndex:dayOfWeek];
}

【讨论】:

猜你喜欢
  • 2022-01-21
  • 2023-01-03
  • 2011-03-02
  • 2017-11-07
  • 1970-01-01
  • 2017-02-18
  • 2012-03-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多