ОБНОВЛЕНИЕ: Это рабочий пример.Использование компонентов NSDate и NSDate для вычисления времени между двумя датами (максимум 6 дней, 23 часа, 59 минут, 59 секунд в будущем)
Сначала мы создаем класс, чтобы держать будний день, ч, мин и сек:
myClass.h
#import <Foundation/Foundation.h>
#import <MapKit/MapKit.h>
@interface myClass : NSObject {
NSString *weekday;
NSInteger hour;
NSInteger minute;
NSInteger second;
}
@property (nonatomic, strong) NSString *weekday;
@property (nonatomic, assign) NSInteger hour;
@property (nonatomic, assign) NSInteger minute;
@property (nonatomic, assign) NSInteger second;
@end
myClass.m
#import "myClass.h"
@implementation myClass
@synthesize weekday, hour, minute, second;
@end
Далее нам нужно создать экземпляр myClass, который содержит нашу информацию о дате.
Добавьте к этому ViewController.h:
@property (nonatomic, strong) NSMutableArray *myArray;
Этот код идет в ViewController.m, где бы вы хотели:
myArray = [[NSMutableArray alloc] init];
//Setup an instance of myClass
myClass *c = [[myClass alloc] init];
[c setWeekday:@"Monday"];
[c setHour:13];
[c setMinute:0];
[c setSecond:0];
[myArray addObject:c];
Далее нам нужно выяснить, как далеко в будущее нашей событие. Благодаря rdelmar есть код, чтобы сделать это, его ответ ниже
//Create a func that returns an NSDate. It requires that the Weekday, HR, Min and Secs are passed into it.
-(NSDate *)getNextDateOn:(NSString *)weekday atHour:(NSInteger)hour minute:(NSInteger)mins second:(NSInteger)secs {
//Setup an array of weekdays to compare to the imported (NSString *)weekday
NSArray *array = [NSArray arrayWithObjects:@"Sunday",@"Monday",@"Tuesday",@"Wednesday",@"Thursday",@"Friday",@"Saturday",nil];
NSInteger weekdayNumber = [array indexOfObject:[weekday capitalizedString]] + 1;
//This code finds how many days in the future the imported (NSString *)weekday is
NSDate *now = [NSDate date];
NSCalendar *cal = [NSCalendar autoupdatingCurrentCalendar];
NSDateComponents *nowComps = [cal components:NSWeekdayCalendarUnit|NSHourCalendarUnit|NSMinuteCalendarUnit|NSSecondCalendarUnit fromDate:now];
NSInteger daysForward = (weekdayNumber - nowComps.weekday + 7) % 7;
//Lastly, create an NSDate called eventDate that consists of the
NSDateComponents *eventComps = [[NSDateComponents alloc] init];
[eventComps setDay:daysForward];
[eventComps setHour: hour - nowComps.hour];
[eventComps setMinute: mins - nowComps.minute];
[eventComps setSecond: secs - nowComps.second];
eventDate = [cal dateByAddingComponents:eventComps toDate:now options:0];
return eventDate;
}
Здесь мы берем вновь созданный EVENTDATE и использовать его для создания нашего мероприятия в ческих:
EKEventStore *eventStore = [[EKEventStore alloc] init];
EKEvent *event = [EKEvent eventWithEventStore:eventStore];
event.title = @"Move your car!";
event.startDate = eventDate;
event.endDate = [[NSDate alloc] initWithTimeInterval:60.0f * 60.0f sinceDate:event.startDate]; //1 hr long
[event addAlarm:[EKAlarm alarmWithRelativeOffset:60.0f * -30.0f]]; //30 min before
//eventLoc was created using CLGeocoder and the method reverseGeocodeLocation:
//The location is not necessary to create an event but if you'd like the code, ask and i'll post it.
[event setLocation:eventLoc];
[event setNotes:@"This event was set by me. ;P"];
[event setCalendar:[eventStore defaultCalendarForNewEvents]];
NSError *err;
[eventStore saveEvent:event span:EKSpanThisEvent error:&err];
NSLog(@"Event Set");
Я надеюсь, что это помогает кому-то столько, сколько мне помогло.
: END OF UPDATE:
Я прочитал документацию NSDate в надежде найти легкий способ найти «следующий наступающий пн 1:00 PM».
Например, можно сказать, что пекарня открыта 1 день в неделю (Чт) с 9:00 до 18:00 ... Если сейчас четверг, 8 утра, я хочу получить NSDate в течение 1 часа. Если сегодня было четверг с 7 вечера, я бы хотел NSDate на следующий четверг в 9 утра.
Я планирую сделать мероприятие в iCal (тесты прошли успешно), но проблема заключается в вычислении времени события.
Можете ли вы указать мне хорошее объяснение NSDate или помочь мне выяснить, как рассчитать NSDate, который я ищу?
Я ищу, чтобы исправить этот код:
EKEventStore *eventStore = [[EKEventStore alloc] init];
EKEvent *event = [EKEvent eventWithEventStore:eventStore];
event.title = @"Bakery's Open!";
event.startDate = [[NSDate alloc] init];
event.endDate = [[NSDate alloc] initWithTimeInterval:600 sinceDate:event.startDate];
[event setCalendar:[eventStore defaultCalendarForNewEvents]];
NSError *err;
[eventStore saveEvent:event span:EKSpanThisEvent error:&err];
Отличная работа, это работает! Я скоро отправлю рабочий пример вверх. –