Filed under: NSDate

NSDate - Zero Out Seconds

I recently had a scenario where I was getting the current date using:

Now in many scenarios, this code will work perfectly, but the issue I had was I was performing some quite advanced calculations on the date, and the date contained a value for seconds, which threw my calculations off a little, because I hadn't factored seconds into my equations.

The following code, when passed a NSDate object will 'zero' out the second value, leaving you with an absolute value;

Useful NSDate Functions

I often find that I have to create dates based upon other dates. NSDate doesn't allow for the easy creation of dates; for example, what if you wanted to create a date which was exactly 5 minutes from now? It would require quite complex code to be wrote each time you wanted to create the date.
So I wrote this simple class which takes the some pain away from date manipulation within Objective-C.

 
// 
// DateFunctions.h 
// 
// Created by Mick Walker on 26/06/2010. 
// Copyright 2010 Mick Walker. All rights reserved. 
// 
#import <Foundation/Foundation.h> 
@interface DateFunctions : NSObject { 
} 
+ (NSDate *) dateWithDaysFromNow: (NSUInteger) days; 
+ (NSDate *) dateWithDaysBeforeNow: (NSUInteger) days; 
+ (NSDate *) dateWithHoursFromNow: (NSUInteger) dHours; 
+ (NSDate *) dateWithHoursBeforeNow: (NSUInteger) dHours; 
+ (NSDate *) dateWithMinutesFromNow: (NSUInteger) dMinutes; 
+ (NSDate *) dateWithMinutesBeforeNow: (NSUInteger) dMinutes; 
+ (NSDate *) dateTomorrow; 
+ (NSDate *) dateYesterday; 
+ (NSDate *) dateWithDaysFromDate:(NSDate *) date numberOfDays:(NSUInteger) days; 
+ (NSDate *) dateWithDaysBeforeDate:(NSDate *) date numberOfDays:(NSUInteger) days; 
+ (NSDate *) dateWithHoursFromDate:(NSDate *) date numberOfHours:(NSUInteger) hours; 
+ (NSDate *) dateWithHoursBeforeDate:(NSDate *) date numberOfHours:(NSUInteger) hours; 
+ (NSDate *) dateWithMinutesFromDate:(NSDate *) date numberOfMinutes:(NSUInteger) mins; 
+ (NSDate *) dateWithMinutesBeforeDate:(NSDate *) date numberOfMinutes:(NSUInteger) mins; 
+ (BOOL) isDateToday:(NSDate *) date; 
+ (NSInteger) numberOfDaysAway:(NSDate *) date; 
@end 
 
// 
// DateFunctions.m 
// 
// Created by Mick Walker on 26/06/2010. 
// Copyright 2010 Mick Walker. All rights reserved. 
// 
#import "DateFunctions.h" 
 
#define D_MINUTE 60 
#define D_HOUR 3600 
#define D_DAY 86400 
#define D_WEEK 604800 
#define D_YEAR 31556926 
 
#define DATE_COMPONENTS (NSYearCalendarUnit| NSMonthCalendarUnit | NSDayCalendarUnit | NSWeekCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit | NSWeekdayCalendarUnit | NSWeekdayOrdinalCalendarUnit) 
#define CURRENT_CALENDAR [NSCalendar currentCalendar] 
@implementation DateFunctions 
+ (NSDate *) dateWithDaysFromNow: (NSUInteger) days 
{ 
 NSTimeInterval aTimeInterval = [[NSDate date] 
 timeIntervalSinceReferenceDate] + D_DAY * days; 
 NSDate *newDate = [NSDate 
 dateWithTimeIntervalSinceReferenceDate:aTimeInterval]; 
 return newDate; 
} 
 
+ (NSDate *) dateWithDaysBeforeNow: (NSUInteger) days 
{ 
 NSTimeInterval aTimeInterval = [[NSDate date] 
 timeIntervalSinceReferenceDate] - D_DAY * days; 
 NSDate *newDate = [NSDate 
 dateWithTimeIntervalSinceReferenceDate:aTimeInterval]; 
 return newDate; 
} 
 
+ (NSDate *) dateWithHoursFromNow: (NSUInteger) dHours 
{ 
 NSTimeInterval aTimeInterval = [[NSDate date] 
 timeIntervalSinceReferenceDate] + D_HOUR * dHours; 
 NSDate *newDate = [NSDate 
 dateWithTimeIntervalSinceReferenceDate:aTimeInterval]; 
 return newDate; 
} 
 
+ (NSDate *) dateWithHoursBeforeNow: (NSUInteger) dHours 
{ 
 NSTimeInterval aTimeInterval = [[NSDate date] 
 timeIntervalSinceReferenceDate] - D_HOUR * dHours; 
 NSDate *newDate = [NSDate 
 dateWithTimeIntervalSinceReferenceDate:aTimeInterval]; 
 return newDate; 
} 
 
+ (NSDate *) dateWithMinutesFromNow: (NSUInteger) dMinutes 
{ 
 NSTimeInterval aTimeInterval = [[NSDate date] 
 timeIntervalSinceReferenceDate] + D_MINUTE * dMinutes; 
 NSDate *newDate = [NSDate 
 dateWithTimeIntervalSinceReferenceDate:aTimeInterval]; 
 return newDate; } 
 
+ (NSDate *) dateWithMinutesBeforeNow: (NSUInteger) dMinutes 
{ 
 NSTimeInterval aTimeInterval = [[NSDate date] 
 timeIntervalSinceReferenceDate] - D_MINUTE * dMinutes; 
 NSDate *newDate = [NSDate 
 dateWithTimeIntervalSinceReferenceDate:aTimeInterval]; 
 return newDate; } 
 
+ (NSDate *) dateTomorrow 
{ 
 return [self dateWithDaysFromNow:1]; 
} 
 
+ (NSDate *) dateYesterday 
{ 
 return [self dateWithDaysBeforeNow:1]; 
} 
 
+ (NSDate *) dateWithDaysFromDate:(NSDate *) date numberOfDays:(NSUInteger) days { 
 NSTimeInterval aTimeInterval = [date 
 timeIntervalSinceReferenceDate] + D_DAY * days; 
 NSDate *newDate = [NSDate dateWithTimeIntervalSinceReferenceDate:aTimeInterval]; 
 return newDate; 
} 
 
+ (NSDate *) dateWithDaysBeforeDate:(NSDate *) date numberOfDays:(NSUInteger) days { 
 NSTimeInterval aTimeInterval = [date timeIntervalSinceReferenceDate] - D_DAY * days; 
 NSDate *newDate = [NSDate dateWithTimeIntervalSinceReferenceDate:aTimeInterval]; 
 return newDate; 
} 
// 
+ (NSDate *) dateWithHoursFromDate:(NSDate *) date numberOfHours:(NSUInteger) hours { 
 
 NSTimeInterval aTimeInterval = [date timeIntervalSinceReferenceDate] + D_HOUR * hours; 
 NSDate *newDate = [NSDate dateWithTimeIntervalSinceReferenceDate:aTimeInterval]; 
 return newDate; 
} 
 
+ (NSDate *) dateWithHoursBeforeDate:(NSDate *) date numberOfHours:(NSUInteger) hours { 
 NSTimeInterval aTimeInterval = [date timeIntervalSinceReferenceDate] - D_HOUR * hours; 
 NSDate *newDate = [NSDate dateWithTimeIntervalSinceReferenceDate:aTimeInterval]; 
 return newDate; 
} 
 
+ (NSDate *) dateWithMinutesFromDate:(NSDate *) date numberOfMinutes:(NSUInteger) mins { 
 NSTimeInterval aTimeInterval = [date timeIntervalSinceReferenceDate] + D_MINUTE * mins; 
 NSDate *newDate = [NSDate dateWithTimeIntervalSinceReferenceDate:aTimeInterval]; 
 return newDate; 
} 
+ (NSDate *) dateWithMinutesBeforeDate:(NSDate *) date numberOfMinutes:(NSUInteger) mins { 
 NSTimeInterval aTimeInterval = [date timeIntervalSinceReferenceDate] - D_MINUTE * mins; 
 NSDate *newDate = [NSDate dateWithTimeIntervalSinceReferenceDate:aTimeInterval]; 
 return newDate; 
} 
 
+ (BOOL) isDateToday:(NSDate *) date { 
 NSDateComponents *otherDay = [[NSCalendar currentCalendar] components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit fromDate:date]; 
 NSDateComponents *today = [[NSCalendar currentCalendar] components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit fromDate:[NSDate date]]; 
 if([today day] == [otherDay day] && 
 [today month] == [otherDay month] && 
 [today year] == [otherDay year]) { 
 //do stuff 
 return YES; 
 } 
 return NO; 
 
} 
+ (NSInteger) numberOfDaysAway:(NSDate *) date { 
 return 1; 
} 
 
@end 

I hope this helps someone else.