我正在尝试创建一个日历应用程序来显示事件。
其中一些事件是重复发生的事件(每日、每周)。
假设在 2012 年 1 月 10 日创建了两个事件 eventA(每周)和 eventB(每天)。
因此当用户打开当前月历时,我需要根据它们的重复模式确定这些事件是否在今天显示。
现在我是按照以下方式做的:
获取事件开始日期
NSDate * startDate
生成偏移尾注
NSDate *offSetEndDate = [startDate dateByAddingYears:10];
我想显示这些事件从开始日期起 utpo 10 年
现在将事件发生日期添加到数组中:
//Daily
if (recurring==1) {
NSDate *nextOccurenceDate = [startDate dateByAddingDays:1];
BOOL eventCrossedOffSetDate = NO;
while (eventCrossedOffSetDate == NO) {
[dateArr addObject:[nextOccurenceDate shortDateString]];
nextOccurenceDate = [nextOccurenceDate dateByAddingDays:1];
if (![self isDateValid:nextOccurenceDate andEndDate:offsetEndDate]) {
eventCrossedOffSetDate = YES;
}
}
}
这会为事件生成一个从开始日期到当前日期的日期数组。
然后我使用这个数组来检查当前日期/用户选择的日期是否存在以显示/隐藏事件。
这个方法只是比较两个日期。
-(BOOL)isDateValid:(NSDate*)startDate andEndDate:(NSDate*)endDate{
if ([startDate compare:endDate] == NSOrderedDescending) {
//"startDate is later than endDate
return NO;
} else if ([startDate compare:endDate] == NSOrderedAscending) {
//startDate is earlier than endDate
return YES;
} else {
//dates are the same
return YES;
}
return NO;
}
这当然可以完成工作,但对于更多事件,这会花费太多时间来执行计算和返回数组。
我可以做些什么来改进它吗?
最佳答案
对于每周事件,只需检查 someDate
的工作日是否与事件的工作日匹配:
let eventWeekDay = Calendar.current.component(.weekday, from: event.startDate)
let todayWeekDay = Calendar.current.component(.weekday, from: Date())
if todayWeekDay == eventWeekDay
{
// Today has the weekly event.
}
关于ios - 检查 NSDate 是否以特定模式出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45373595/