【问题标题】:Getting date from weekday从工作日获取日期
【发布时间】:2013-09-16 16:46:02
【问题描述】:

我正在做这个应用程序,用户输入几天(使用 UITableView,周一 - 周日)。 然后,我需要该应用程序来确定与哪些日期匹配。假设用户在 15 号星期日坐下并选择星期一和星期二。该应用会计算出日期是 16 日星期一和 17 日星期二。

如何使用 NSDate 等来解决这个问题?我知道如何使用日期找到工作日,但我想要相反。

当然必须是最近的日子,比如不是找到 23 号星期一,而是找到 16 号。

希望这是有道理的。 :-)

【问题讨论】:

    标签: ios objective-c nsdate


    【解决方案1】:

    直接方法,不使用循环:

    NSUInteger targetWeekday = ...; // 1 = Sunday, 2 = Monday, ...
    
    // Date components for today:
    NSCalendar *cal = [NSCalendar currentCalendar];
    NSDate *now = [NSDate date];
    NSDateComponents *comp = [cal components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit|NSWeekdayCalendarUnit
                                    fromDate:now];
    
    // Adjust components for target weekday:
    if (targetWeekday >= comp.weekday) {
        comp.day += (targetWeekday - comp.weekday);
    } else {
        comp.day += (targetWeekday + 7 - comp.weekday); // Assuming 7 days per week.
    }
    comp.weekday = targetWeekday;
    
    // And back to NSDate:
    NSDate *targetDate = [cal dateFromComponents:comp];
    

    备注:

    if (targetWeekday >= comp.weekday) {
        comp.day += (targetWeekday - comp.weekday);
    } else {
        comp.day += (targetWeekday + 7 - comp.weekday); // Assuming 7 days per week.
    }
    

    可以用更短的等效代码代替

    comp.day += (targetWeekday + 7 - comp.weekday) % 7;
    

    【讨论】:

    • 您可以将 if/else 语句替换为 comp.day += (targetWeekday - comp.weekday) % 7; 以使其更简洁。
    • @TylerAndFriends:你必须加上(targetWeekday + 7 - comp.weekday) % 7,因为负数的模是负数! - 我曾考虑过这一点,但决定发布更容易理解的代码。但是感谢您的反馈,我现在已将其添加到答案中。
    • 哦,我的错,我最近一直在使用python,其中负数的模数是正数:)
    【解决方案2】:

    你可以通过一个简单的过程来做到这一点:

    1. 以代表今天的NSDate 开头
    2. 从中获取星期几 (here is how it is done)
    3. 如果星期几与所选UITableViewCell 中的日期匹配,则说明您已完成。
    4. 否则,在NSDate (here is how it is done) 上加一天,然后返回步骤 2。

    【讨论】:

    • 如前所述,我已经知道如何从当前的 NSDate 中获取工作日,所以这很简单。所以我会尝试只添加一个,再次检查,然后添加直到匹配。谢谢一堆。 :-)
    • @ChristianLundtofte 欢迎您!诸如此类的一般问题往往会被搜索引擎找到,因此其他人很可能会利用您的问题。这就是为什么我添加了指向其他 SO 问题的链接 - 通过搜索引擎找到此问题的其他用户可能不知道如何从 NSDate 获取工作日,或者如何添加一天。
    猜你喜欢
    • 2017-04-25
    • 1970-01-01
    • 1970-01-01
    • 2021-12-09
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 2011-12-21
    • 1970-01-01
    相关资源
    最近更新 更多