【问题标题】:how can I improve this "DateFromNextWeekDay:FromDate" method code?如何改进这个“DateFromNextWeekDay:FromDate”方法代码?
【发布时间】:2011-03-20 23:42:34
【问题描述】:

很高兴听到有关如何改进/缩短此方法的建议。总之需要:

  • 查找下一个日期,它的星期几(例如星期三)与传递给方法的日期相匹配。
  • 例如,给定日期(包括该给定日期)的下一个 WED

代码如下:

- (NSDate*)DateFromNextWeekDay:(NSInteger)weekDay FromDate:(NSDate*)fromDate {
    // Returns the next week day, as specified by "weekDay", from the specified "fromDate" 
    NSDate *fromDateMidday = [[NSDate date] dateBySettingHour:12 andMinute:0];
    NSDate *dateCounter  = [[fromDateMidday copy] dateByAddingTimeInterval:-86400];     // Take 1 day away, which will get incremented in the loop
    NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    NSInteger day;
    do{
        dateCounter  = [dateCounter dateByAddingTimeInterval:86400];
        unsigned units = NSWeekdayCalendarUnit;
        NSDateComponents *components = [gregorian components:units fromDate:dateCounter];
        day = [components weekday];
    } while(day != weekDay);
    [gregorian release];
    return dateCounter;
}

谢谢

【问题讨论】:

    标签: iphone objective-c ios nsdate nsdatecomponents


    【解决方案1】:

    您可以只找到传入日期的星期几,从目标星期几中减去该日期,最后将该结果添加到传入的日期。无需循环访问日期。所以应该是:

    daysToAdd = (targetDayOfWeek - currentDayDayOfWeek) % 7

    修改减法的原因是为了处理目标日期小于当前日期的情况(例如,它是星期六,您正在寻找星期二)。

    【讨论】:

    • 哇哦 - 我没有意识到你可以像这样添加/减去日期!
    • 所以结果“nextDate”本身会保留原始“currentDate”的时间(即小时/分钟)对吗?而且您仍然需要使用 NSDateComponents 计算 currentDay 正确吗?
    • @greg 您不会被添加日期对象本身。您将使用当前使用的相同技术(设置 NSDateComponents,然后使用 weekday 属性)来获取 NSInteger 表示星期几。然后你可以做数学运算,最后把这个天数加回到原来的日期。
    • @Greg 没问题,很高兴我能帮上忙
    猜你喜欢
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-17
    • 2011-04-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多