【问题标题】:Check whether NSDate is Monday/Tues/etc检查 NSDate 是否为 Monday/Tues/etc
【发布时间】:2015-05-20 21:43:59
【问题描述】:

我有一个 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"]) {

}

【问题讨论】:

  • stackoverflow.com/questions/9874503/… 不比较字符串。不是世界上每个人都有“星期一”……蒙塔格?隆迪?月牙?
  • 或至少将格式化程序的语言环境设置为 en_US_POSIX
  • @MarcB 您的评论是问题的基础。 OP 询问非英语语言环境以及工作日名称会有所不同的事实。

标签: ios objective-c cocoa-touch date nsdate


【解决方案1】:

您可以使用以下程序。

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;
}

【讨论】:

  • 小心,因为根据地区的不同,星期一可能是第一周。
  • 没关系。如果星期一是一周的第一天,它的索引仍然是 2(!)。话虽如此。索引是错误的。请参阅documentation of NSCalendarUnitWeekDay 工作日单位是数字 1 到 N(公历 N=7,1 是星期日)。
  • @rmaddy answer 将星期日索引为 0。但您的答案将 1 视为星期日。那么它是哪一个?
  • @Supertecnoboff 这个答案和我的都是正确的。 NSDateComponents weekday 方法返回 1-7 范围内的值,星期日为 1。在我的回答中,我得到了一个数组的索引,该数组的范围为 0-6,星期日为 0。它们是两个完全不同的方法,因此每一种都需要相应地处理。
【解决方案2】:

虽然使用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;
}

【讨论】:

  • 是的。 NSDateFormatter weekdaySymbols(以及类中的所有其他符号)将适用于日期格式化程序上设置的任何语言环境(默认为用户的当前语言环境)。但请记住,我指出这是一种二流解决方案。另一个答案是使用NSDateComponents 比执行所有日期格式和字符串查找要高效得多。
【解决方案3】:

在你的 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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-01
    • 2011-01-25
    • 2016-12-22
    • 2016-05-21
    • 2010-11-07
    • 2011-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多