2012-03-22 2 views
0

ОБНОВЛЕНИЕ: Это рабочий пример.Использование компонентов 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]; 

ответ

1

Чтобы найти дату, как это требует использования NSDateComponents и NSCalendar. Основная задача, я думаю, состоит в том, чтобы выяснить, сколько дней в будущем будет ваша целевая дата. Чтобы сделать это, вам нужно получить компонент даты дня недели текущей даты и рассчитать, сколько дней это будет в будний день, который вы ищете. Я думаю, что следующий код должен получить закрытия:

-(NSDate *)getNextDateOn:(NSString *)weekday atHour:(NSInteger)hour minute:(NSInteger)mins second:(NSInteger)secs { 
NSArray *array = [NSArray arrayWithObjects:@"Sunday",@"Monday",@"Tuesday",@"Wednesday",@"Thursday",@"Friday",@"Saturday",nil]; 
NSInteger weekdayNumber = [array indexOfObject:[weekday capitalizedString]] + 1; 
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; 

NSDateComponents *eventComps = [[NSDateComponents alloc] init]; 
[eventComps setDay:daysForward]; 
[eventComps setHour: hour - nowComps.hour]; 
[eventComps setMinute: mins - nowComps.minute]; 
[eventComps setSecond: secs - nowComps.second]; 
NSDate *eventDate = [cal dateByAddingComponents:eventComps toDate:now options:0]; 
[eventComps release]; 
return eventDate; 

}

+0

Отличная работа, это работает! Я скоро отправлю рабочий пример вверх. –