Использование компонентов NSDate и NSDate для вычисления времени между 2 датами (максимум 6 дней, 23 часа, 59 минут, 59 секунд в будущем) - PullRequest
0 голосов
/ 22 марта 2012

ОБНОВЛЕНИЕ: это рабочий пример.

Сначала мы создадим класс для хранения дней недели, часов, минут и секунд:

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 и используем его для создания нашего события в iCal:

        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");

Надеюсь, это кому-то поможет так же, как и мне.

: КОНЕЦ ОБНОВЛЕНИЯ:

Я прочитал документацию NSDate в надежде найти простой способ найти «следующий предстоящий понедельник 1:00 PM».

Например, допустим, пекарня открыта 1 день в неделю (четверг) с 9:00 до 18:00 ... Если сейчас четверг, 8:00, я хочу получить NSDate на 1 час. Если бы сегодня было четверг в 19:00, я бы хотел NSDate для следующего четверга в 9:00.

Я планирую создать событие в 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 Ответ

1 голос
/ 23 марта 2012

Чтобы найти такую ​​дату, необходимо использовать 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;

}

...