【问题标题】:Calculating certain NSDates from days of weeks/weeks of years从数周/数周计算某些 NSDates
【发布时间】:2015-07-09 11:44:01
【问题描述】:

有没有一种简单的方法可以根据NSCalendar 和/或NSCalendarComponents 的条件计算日期?我已经看了一段时间的文档,但似乎有点复杂。例如,我需要 接下来 15 个偶数周的“星期三下午 6:00”(如果是偶数周且尚未超过该日期/时间,则包括这一周。)

【问题讨论】:

    标签: ios objective-c time nsdate nscalendar


    【解决方案1】:

    这是一种确定从哪个星期三开始然后获取下一个 14 偶数周星期三的方法。这没有考虑您问题的时间部分,但您可以使用类似的方法来处理时间。

    + (NSArray *)nextFifteenEvenNumberedWeekWednesdays:(NSDate *)startingDate
    {
        static const NSInteger Wednesday = 4;
        static const NSInteger OneDay = 60 * 60 * 24;
        NSCalendar *calender = [NSCalendar currentCalendar];
        NSDateComponents *startingDateComponents = [calender components:(NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitWeekday | NSCalendarUnitWeekOfYear)
                                                               fromDate:startingDate];
    
        // Go to the closest Wednesday
        NSInteger daysToWednesday = Wednesday - startingDateComponents.weekday;
        if (startingDateComponents.weekday > Wednesday) {
            // We already passed wednesday, so go to the next wednesday
            if (startingDateComponents.weekOfYear % 2 == 0) {
                // If this date is past Wednesday but is on an even week, then moving to the next wednesday
                // will be an odd week. So skip forward one week.
                startingDate = [startingDate dateByAddingTimeInterval:7 * OneDay];
            }
            daysToWednesday = 7 + daysToWednesday; // get the next Wednesday
        }
        startingDate = [startingDate dateByAddingTimeInterval:daysToWednesday * OneDay]; // Move to wednesday
    
        NSMutableArray *wednesdays = [NSMutableArray array];
        for (NSInteger i = 0; i < 15; i++) {
            // Add every other wednesday
            [wednesdays addObject:[startingDate dateByAddingTimeInterval:14 * i * OneDay]];
        }
    
        return [wednesdays copy];
    }
    

    【讨论】:

    • 在看到这个之前我想出了别的东西。显然dateBySettingUnit 将自动提前到下一个日期以满足更改,因此不需要 if 子句或数学运算。
    【解决方案2】:

    我最终回答了我自己的问题。当您知道-[NSCalendar dateBySettingUnit:value:ofDate:options:] 自动递增到下一个匹配日期时,这真的很容易。

    NSCalendar *calendar = [NSCalendar calendarWithIdentifier:NSCalendarIdentifierISO8601];
    
    NSDate *date = [NSDate date];
    
    // find the next Wednesday 6 o'clock
    date = [calendar dateBySettingUnit:NSCalendarUnitSecond value:0 ofDate:date options:0];
    date = [calendar dateBySettingUnit:NSCalendarUnitMinute value:0 ofDate:date options:0];
    date = [calendar dateBySettingUnit:NSCalendarUnitHour value:18 ofDate:date options:0];
    date = [calendar dateBySettingUnit:NSCalendarUnitWeekday value:4 ofDate:date options:0];
    
    // skip one week if it's not an even week
    NSDateComponents *components = [calendar components:NSCalendarUnitWeekOfYear fromDate:date];
    date = [calendar dateByAddingUnit:NSCalendarUnitWeekOfYear value:components.weekOfYear % 2 toDate:date options:0];
    
    // 15 weeks of this
    for (int i = 0; i < 15; i++)
    {
        NSDate *testDate = [calendar dateByAddingUnit:NSCalendarUnitWeekOfYear value:i * 2 toDate:date options:0];
        NSLog(@"Date: %@", testDate);
    }
    

    【讨论】:

      猜你喜欢
      • 2021-04-23
      • 2020-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-19
      相关资源
      最近更新 更多