gpt4 book ai didi

objective-c - 给定过去的 NSDate 和重复间隔,计算从现在开始的下一个事件

转载 作者:行者123 更新时间:2023-12-03 17:31:16 25 4
gpt4 key购买 nike

如何通过重复一定的时间间隔,从过去的日期计算出比现在晚的第一个日期?例如:

// Date in the past
NSDate *pastDate = [NSDate my_dateWithString:@"11/09/2001"];

// Time interval
NSTimeInterval repeatInterval = 14 * 24 * 60 * 60; // 2 weeks

// Current date
NSDate *now = [NSDate date]; // 23/07/2015

// Start calculating next date ->
NSDate *nextDate = /* interval added to past date */
// Is result later than now?
// No? Calculate again
// Abracadabra

NSLog(@"nexDate = %@",nextDate); // 28/07/2015

我不想使用迭代。我担心计算诸如一年前的开始日期和一天的重复间隔之类的情况。

这是我的解决方案,但它有迭代。

  NSDateComponents *twoWeeksDateComponents = [NSDateComponents new];
twoWeeksDateComponents.weekOfMonth = 2;

NSDate *date = self.picker.date;
NSCalendar *calendar = [NSCalendar currentCalendar];

NSDate *now = [NSDate date];
NSDate *nextDate = date;
NSComparisonResult result = [nextDate compare:now];
while (result == NSOrderedAscending) {
nextDate = [calendar dateByAddingComponents:kTwoWeeksDateComponents
toDate:nextDate
options:NSCalendarMatchNextTime];
result = [nextDate compare:now];
}
NSLog(@"nexDate = %@",nextDate); // 28/07/2015

最佳答案

您确实可以在不迭代的情况下做到这一点,只需使用一点算术即可。您正在寻找严格大于另一个值n的某个因子f的最接近倍数。作为日历计算,它有点复杂,但仍然只是算术(并且 NSCalendar 当然会为您完成所有繁重的工作 - 例如,闰年)。

NSDate * pastDate = ...;
NSDate * now = [NSDate date];

从用户处获取您喜欢的重复间隔,并构造一个表示它的 NSDateComponents:

NSCalendarUnit repeatUnit = NSCalendarUnitWeekOfYear;
NSUInteger repeatInterval = 2;

NSDateComponents * repeatComps = [NSDateComponents new];
[repeatComps setValue:repeatInterval forComponent:repeatUnit];

给定重复单位,找到两个日期之间出现的该单位的数量,作为另一个日期组件对象:

NSCalendar * cal = [NSCalendar currentCalendar];
NSDateComponents * deltaComps = [cal components:repeatUnit
fromDate:pastDate
toDate:now
options:0];
NSInteger deltaVal = [deltaComps valueForComponent:repeatUnit];

现在是算术位。将增量向下舍入为最接近的重复间隔倍数。然后添加该舍入值(使用适当的单位)将生成等于或早于现在的日期。

现在,作为下巴拳击手 has pointed out ,对于 NSCalendarUnitMonthrepeatUnit ,如果您使用该值计算日期,然后再添加一个重复间隔(如该答案的原始版本所做的那样),您会得到意外的结果。相反,立即将重复次数加一;那么日历可以正确处理月份增量。

NSInteger repeatsJustPastNow = 1 + deltaVal - (deltaVal % repeatInterval);

NSDateComponents * toNowComps = [NSDateComponents new];
[toNowComps setValue:repeatsJustPastNow
forComponent:repeatUnit];

NSDate * nextDate;
nextDate = [cal dateByAddingComponents:toNowComps
toDate:pastDate
options:0];

Jawboxer 的 Swift version of this corrected code is on Github .

关于objective-c - 给定过去的 NSDate 和重复间隔,计算从现在开始的下一个事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31596749/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com