ios - 检查 NSDate 是否以特定模式出现

标签 ios arrays nsdate

我正在尝试创建一个日历应用程序来显示事件。

其中一些事件是重复发生的事件(每日、每周)。

假设在 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/

相关文章:

ios - 使用 NSDate 计算来确定双周支付频率的上一个和下一个支付周期

ios - 将字符串转换为日期返回错误的结果

ios - 快速从viewdidload调用对象

ios - UIBarButtonItem 图像未显示,而是显示红色方 block

java - 如何处理java.lang.ArrayIndexOutOfBoundsException?

javascript - 无法在 JavaScript 中正确更新数组...逻辑错误?

swift - NSDate() 或 Date() 显示错误的时间

ios - 一旦 13 位时间戳保存在 firebase 中,如何在 Xcode 中获取它并将其转换为日期?

ios - AVSpeechSynthesizer 检测到说话结束?

C++ 添加到数组末尾