Xcode - 设置月份的星期,然后得到年份的星期。

问题描述 投票:0回答:1

目前正在尝试使用NSDateFormatter和NSDateComponents来设置一个月的周数,然后找出那是哪一年的星期。

比方说,我们有一个日期:20052020,然后将周数设置为0,或1,或2,等等......然后从中找出年份的星期。

到目前为止,用NSDateComponents我试着做过。

NSDate *date = self.date; // 20/05/2020
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *components = [calendar components:NSCalendarUnitMonth | NSCalendarUnitYear fromDate:date];

[components setWeekOfMonth:1];
NSDate *newDate = [calendar dateFromComponents:components];

NSInteger weekOfYear = [calendar components:NSCalendarUnitWeekOfYear fromDate:newDate].weekOfYear;

我总是得到这样的结果 18.

预期的输出。

Change week of month to: 1 | output: 19 (4th)
Change week of month to: 2 | output: 20 (11th)
Change week of month to: 3 | output: 21 (18th)
Change week of month to: 4 | output: 22 (25th)
objective-c xcode nsdateformatter
1个回答
2
投票

问题是设置 setWeekOfMonth 中的日期组件没有效果。

相反,在日期组件中设置 weekdayweekdayOrdinal

NSDate *date = self.date; // 20/05/2020
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *components = [calendar components:NSCalendarUnitMonth | NSCalendarUnitYear fromDate:date];
components.weekday = 2;
components.weekdayOrdinal = 3;
NSDate *newDate = [calendar dateFromComponents:components];

NSInteger weekOfYear = [calendar components:NSCalendarUnitWeekOfYear fromDate:newDate].weekOfYear;

这是一种不同的方法。

它计算的是当月的第一个周一,然后列举接下来的周一,直到月底。

- (NSArray *)yearOfWeeksInCurrentMonth
{
    NSCalendar *calendar = [NSCalendar currentCalendar];
    NSDateComponents *components = [calendar components: NSCalendarUnitMonth | NSCalendarUnitYear fromDate:[NSDate date]];
    components.weekday = 2;
    components.weekdayOrdinal = 1;

    NSDate *firstMonday = [calendar dateFromComponents:components];
    NSInteger weekOfYear = [calendar component:NSCalendarUnitWeekOfYear fromDate:firstMonday];

    __block NSMutableArray *result = [NSMutableArray array];
    [result addObject:@[firstMonday, @(weekOfYear)]];
    NSDateComponents *weekComponents = [calendar components: NSCalendarUnitWeekday fromDate:firstMonday];
    [calendar enumerateDatesStartingAfterDate:firstMonday matchingComponents:weekComponents options:NSCalendarMatchNextTime usingBlock:^(NSDate * _Nullable date, BOOL exactMatch, BOOL * _Nonnull stop) {
        if (date != nil) {
            if ( [calendar component:NSCalendarUnitMonth fromDate:date] > components.month ) {
                *stop = YES;
            } else {
                NSInteger weekOfYear = [calendar component:NSCalendarUnitWeekOfYear fromDate:date];
                [result addObject:@[date, @(weekOfYear)]];
            }
        }
    }];
    return [result copy];
}

返回值是一个数组,包含日期(NSDate)和相应的weekOfYear(NSNumber)。

(
        (
        "2020-05-03 22:00:00 +0000",
        19
    ),
        (
        "2020-05-10 22:00:00 +0000",
        20
    ),
        (
        "2020-05-17 22:00:00 +0000",
        21
    ),
        (
        "2020-05-24 22:00:00 +0000",
        22
    )
)
© www.soinside.com 2019 - 2024. All rights reserved.