Reputation: 16430
I'd like to create a simple pills reminder iOS application (let's leave notifications aside for the moment). I want to create a single DB record for a pill that has repetitions and check if a specific day intersects date "generated" by the repetition.
Example: I set a pills period that starts from April 12 and ends April 20, with repetition every 2 days , at 3.00 pm. So this pills is valid for this dates :
Questions:
Which type of data can describe the information "Every 2 days"? NSDateInterval would be a good solution ?
How can i verify that a specific day agrees with my repetition scheme ? (i.e. Check if April 13 is a valid date for the previous example and get "NO" as answer)
Upvotes: 0
Views: 1024
Reputation: 1078
Here is an example class which should meet your criteria:
main.m
#import <Foundation/Foundation.h>
#import "DateChecker.h"
int main(int argc, const char * argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
// Specify a period in days
NSInteger period = 2;
// Set the start/end/current days. These can be retrieved from a database or elsewhere
NSDate *startDate = [NSDate dateWithString:@"2012-04-12 00:00:00 +0000"];
NSDate *endDate = [NSDate dateWithString:@"2012-04-20 00:00:00 +0000"];
NSDate *currentDate = [NSDate dateWithString:@"2012-04-14 00:00:00 +0000"];
// Actually do the checking. This could alternatively be offloaded to a function in DateChecker
if([DateChecker date:currentDate isBetweenDate:startDate andDate:endDate])
{
if([DateChecker date:currentDate fallsOnStartDate:startDate withInterval:period])
{
NSLog(@"The date %@ falls in the specified date period & is on the interval date.", currentDate);
}
else
{
NSLog(@"The date %@ falls in the specified date period & is NOT on the interval date.", currentDate);
}
}
else
{
NSLog(@"The date %@ does not fall in the specified date period.", currentDate);
}
[pool release];
return 0;
}
DateChecker.h
#import <Foundation/Foundation.h>
@interface DateChecker : NSObject
{
}
+ (BOOL)date:(NSDate*)date fallsOnStartDate:(NSDate*)beginDate withInterval:(NSInteger)daysInterval;
+ (BOOL)date:(NSDate*)date isBetweenDate:(NSDate*)beginDate andDate:(NSDate*)endDate;
@end
DateChecker.m
#import "DateChecker.h"
@implementation DateChecker
+ (BOOL)date:(NSDate*)date fallsOnStartDate:(NSDate*)beginDate withInterval:(NSInteger)daysInterval
{
NSDateComponents *components;
NSInteger days;
// Get the number of days since the start date
components = [[NSCalendar currentCalendar] components: NSDayCalendarUnit fromDate: beginDate toDate: date options: 0];
days = [components day];
// If the number of days passed falls on the interval, then retrun YES
if(days % daysInterval == 0)
{
return YES;
}
else
{
return NO;
}
}
+ (BOOL)date:(NSDate*)date isBetweenDate:(NSDate*)beginDate andDate:(NSDate*)endDate
{
if ([date compare:beginDate] == NSOrderedAscending)
return NO;
if ([date compare:endDate] == NSOrderedDescending)
return NO;
return YES;
}
@end
That should give you an idea on how to write a class that can handle your requirements. I ran this as a command line app and it seemed to work alright. The function
+ (BOOL)date:(NSDate*)date isBetweenDate:(NSDate*)beginDate andDate:(NSDate*)endDate
was graciously obtained from How to Check if an NSDate occurs between two other NSDates.
Upvotes: 2