计算日期之间的周数,并将其呈现为 NSString(如 Instagram)

Count weeks between dates and present that as an NSString like Instagram

我有一些 NSDate 想以周为单位展示,比如 Instagram 对他们的照片时间戳所做的处理。值为 "This week"、"Last week"、“2 周前”,依此类推到“N 周前”。

请帮我想出这个算法。

任意 date arithmetic you need to do in Cocoa (Touch) will involve NSCalendar and NSDateComponents。他们可以很容易地为您计算出两个日期之间的差异。

NSDate * originDate = ...;
NSCalendar * cal = [NSCalendar currentCalendar];
NSDateComponents * weekComp = [cal components:NSCalendarUnitWeekOfYear
                                     fromDate:originDate
                                       toDate:[NSDate date] // right now
                                      options:0];

现在 [weekComp weekOfYear] 会告诉您这两个日期之间相隔了多少周。

从那里开始,它只是一些字符串格式:

NSInteger weeksAgo = [weekComp weekOfYear];
NSString * timestampString;
switch( weeksAgo ){
    case 0:
        timestampString = @"This week";
        break;
    case 1:
        timestampString = @"Last week";
        break;
    default:
        timestampString = [NSString stringWithFormat:@"%d weeks ago", (int)weeksAgo];
}

如果您需要按“日历”周(星期日到星期六)计算,以便星期三的前一个星期六是“上周”,您必须考虑日期的工作日。

NSDateComponents * weekdayComp = [cal components:NSCalendarUnitWeekday|NSCalendarUnitWeekOfYear
                                        fromDate:originDate
                                          toDate:objDate
                                         options:0];
NSInteger weekdaysAgo = [weekdayComp weekday];
NSInteger objWeekday = [cal component:NSCalendarUnitWeekday fromDate:objDate];
    

在同一调用中向日历询问这两个增量(工作日和一年中的一周)将导致例如从 2015 年 7 月 13 日星期一到 7 月星期三的时间间隔为“1 周,2 天” 2015 年 22 日;大的先计算,小的补余。

然后您将获得目标日期的工作日编号(星期日=1,星期一=2,依此类推)。如果 weekdaysAgo 值等于或大于,则起始日期在 weakOfYear 值指示的前一周。下限除法将给出要添加的周数(1 或 0)。

NSInteger weeksAgo = [weekdayComp weekOfYear] + (weekdaysAgo / objWeekday);

然后,使用这个新的 weeksAgo 值与上面相同的 switch