检查NSDate是否是星期一/二/三等

3

我开发了一个iOS应用程序,需要根据当天时间设置几个不同的日期标签。我正在使用NSDateNSDateFormatter来实现这一点。但是有些事情我不确定:如果用户的iOS设备语言/本地化设置为英语以外的其他内容,那么我的if语句检查当前日期是否为“星期一”或“星期二”等,会停止工作吗?

以下是我的代码:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
dateFormatter.dateFormat = @"yyyyMMdd";
NSDate *date = [NSDate date];

dateFormatter.dateFormat = @"EEEE";
NSString *dayString = [[dateFormatter stringFromDate:date] capitalizedString];
NSLog(@"Day: %@", dayString);


if ([dayString isEqualToString:@"Monday"]) {

}

else if ([dayString isEqualToString:@"Tuesday"]) {

}

else if ([dayString isEqualToString:@"Wednesday"]) {

}

else if ([dayString isEqualToString:@"Thursday"]) {

}

else if ([dayString isEqualToString:@"Friday"]) {

}

else if ([dayString isEqualToString:@"Saturday"]) {

}

else if ([dayString isEqualToString:@"Sunday"]) {

}

1
如何使用NSDate获取星期几并在iOS中使用NSLog显示?不要比较字符串。世界上并非每个人都有“星期一”... Montag?Lundi?Lunes? - Marc B
1
请将格式化程序的地区设置为en_US_POSIX,或至少将其转换为该地区。 - Matthias Bauch
@MarcB 您的评论是问题的基础。原帖问的是关于非英语区域和工作日名称不同的事实。 - rmaddy
3个回答

19

您可以使用以下程序。

NSDateComponents *component = [[NSCalendar currentCalendar] components:NSCalendarUnitWeekday fromDate:[NSDate date]];

switch ([component weekday]) {
    case 1:
        //Sunday
        break;
    case 2:
        //Monday
        break;
    ...
    case 7:
        //Saturday
        break;
    default:
        break;
}

1
注意,根据不同的区域设置,星期一可能是每周的第一天。 - gnasher729
1
无论周一是否为一周的第一天,其索引仍将为2(!)。话虽如此,这些索引是错误的。请参见[NSCalendarUnitWeekDay的文档](https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSCalendar_Class/index.html#//apple_ref/c/tdef/NSCalendarUnit)**星期几单位是1到N的数字(其中对于格里高利历,N=7且1是星期日)。** - Matthias Bauch
@rmaddy的回答将星期天索引为0。但是您的答案将星期天视为1。那么到底是哪个呢? - Supertecnoboff
1
@Supertecnoboff 这个答案和我的都是正确的。NSDateComponents weekday 方法返回一个值在1-7范围内,其中星期日为1。在我的答案中,我获取了一个数组的索引,该数组的范围为0-6,其中星期日为0。它们是两种完全不同的方法,因此每个方法必须分别处理。 - rmaddy

5

虽然使用NSDateComponents的答案是最佳选择,但另一个适用于星期字符串的可能性是:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
dateFormatter.dateFormat = @"EEEE";
NSDate *date = [NSDate date];
NSString *dayString = [dateFormatter stringFromDate:date];

NSInteger weekdayNum = [[dateFormatter weekdaySymbols] indexOfObject:dayString];
switch (weekdayNum) {
    case 0:
        //Sunday
        break;
    case 1:
        //Monday
        break;
    ...
    case 6:
        //Saturday
        break;
    default:
        break;
}

2
是的。NSDateFormatter weekdaySymbols(以及类中的所有其他符号)将适用于日期格式化程序上设置的任何语言环境(默认为用户当前的语言环境)。但请记住,我指出这是一个次等解决方案。另一个答案使用NSDateComponents比进行所有日期格式化和字符串查找更有效。 - rmaddy

2
在Swift中,你可以这样做:
let calendar: Calendar = Calendar.current
let isMonday = calendar.component(Calendar.Component.weekday, from: self) == 2

或者您可以使用这个Date扩展来获取一个日期的星期几:

extension Date {

    enum WeekDay: Int {
        case sunday = 1
        case monday
        case tuesday
        case wednesday
        case thursday
        case friday
        case saturday
    }

    func getWeekDay() -> WeekDay {
        let calendar = Calendar.current
        let weekDay = calendar.component(Calendar.Component.weekday, from: self)
        return WeekDay(rawValue: weekDay)!
    }
}

let date = Date()
date.getWeekDay()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接