Permalink
Fetching contributors…
Cannot retrieve contributors at this time
360 lines (301 sloc) 13.6 KB
//
// NSDateHelper.m
// Enormego Cocoa Helpers
//
// Created by Shaun Harrison on 10/15/08.
// Copyright 2008 enormego. All rights reserved.
//
#import "NSDateHelper.h"
@implementation NSDate (Helper)
+ (NSDate*)dateFromOffSetDays:(NSInteger)offset;
{
NSDate* yourDate = [NSDate new];
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *todayComponents = [gregorian components:(NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit) fromDate:yourDate];
NSInteger theDay = [todayComponents day];
NSInteger theMonth = [todayComponents month];
NSInteger theYear = [todayComponents year];
// now build a NSDate object for yourDate using these components
NSDateComponents *components = [[NSDateComponents alloc] init];
[components setDay:theDay];
[components setMonth:theMonth];
[components setYear:theYear];
NSDate *thisDate = [gregorian dateFromComponents:components];
[components release];
// now build a NSDate object for the next day
NSDateComponents *offsetComponents = [[NSDateComponents alloc] init];
[offsetComponents setDay:offset];
NSDate *nextDate = [gregorian dateByAddingComponents:offsetComponents toDate: yourDate options:0];
[offsetComponents release];
[gregorian release];
return nextDate;
}
+ (NSDate*)dateWithString:(NSString*)dateString formatString:(NSString*)dateFormatterString {
if(!dateString) return nil;
NSDateFormatter* formatter = [[[NSDateFormatter alloc] init] autorelease];
[formatter setDateFormat:dateFormatterString];
return [formatter dateFromString:dateString];
}
+ (NSDate*)dateWithISO8601String:(NSString*)dateString {
if(!dateString) return nil;
if([dateString hasSuffix:@" 00:00"]) {
dateString = [[dateString substringToIndex:(dateString.length-6)] stringByAppendingString:@"GMT"];
} else if ([dateString hasSuffix:@"Z"]) {
dateString = [[dateString substringToIndex:(dateString.length-1)] stringByAppendingString:@"GMT"];
}
return [[self class] dateWithString:dateString formatString:@"yyyy-MM-ddTHH:mm:ssZZZ"];
}
+ (NSDate*)dateWithDateString:(NSString*)dateString {
return [[self class] dateWithString:dateString formatString:@"yyyy-MM-dd"];
}
+ (NSDate*)dateWithDateTimeString:(NSString*)dateString {
return [[self class] dateWithString:dateString formatString:@"yyyy-MM-dd HH:mm:ss"];
}
+ (NSDate*)dateWithLongDateTimeString:(NSString*)dateString {
return [[self class] dateWithString:dateString formatString:@"dd MMM yyyy HH:mm:ss"];
}
+ (NSDate*)dateWithRSSDateString:(NSString*)dateString {
if ([dateString hasSuffix:@"Z"]) {
dateString = [[dateString substringToIndex:(dateString.length-1)] stringByAppendingString:@"GMT"];
}
return [[self class] dateWithString:dateString formatString:@"EEE, d MMM yyyy HH:mm:ss ZZZ"];
}
+ (NSDate*)dateWithAltRSSDateString:(NSString*)dateString {
if ([dateString hasSuffix:@"Z"]) {
dateString = [[dateString substringToIndex:(dateString.length-1)] stringByAppendingString:@"GMT"];
}
return [[self class] dateWithString:dateString formatString:@"d MMM yyyy HH:mm:ss ZZZ"];
}
- (NSString*)formattedDateWithFormatString:(NSString*)dateFormatterString {
if(!dateFormatterString) return nil;
NSDateFormatter* formatter = [[[NSDateFormatter alloc] init] autorelease];
[formatter setDateFormat:dateFormatterString];
[formatter setAMSymbol:@"am"];
[formatter setPMSymbol:@"pm"];
return [formatter stringFromDate:self];
}
- (NSString*)formattedDate {
return [self formattedDateWithFormatString:@"EEE, d MMM 'at' h:mma"];
}
- (NSString*)relativeFormattedDate {
// Initialize the formatter.
NSDateFormatter* formatter = [[[NSDateFormatter alloc] init] autorelease];
[formatter setDateStyle:NSDateFormatterShortStyle];
[formatter setTimeStyle:NSDateFormatterNoStyle];
// Initialize the calendar and flags.
unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSWeekdayCalendarUnit;
NSCalendar* calendar = [NSCalendar currentCalendar];
// Create reference date for supplied date.
NSDateComponents *comps = [calendar components:unitFlags fromDate:self];
[comps setHour:0];
[comps setMinute:0];
[comps setSecond:0];
NSDate* suppliedDate = [calendar dateFromComponents:comps];
// Iterate through the eight days (tomorrow, today, and the last six).
int i;
for (i = -1; i < 7; i++) {
// Initialize reference date.
comps = [calendar components:unitFlags fromDate:[NSDate date]];
[comps setHour:0];
[comps setMinute:0];
[comps setSecond:0];
[comps setDay:[comps day] - i];
NSDate* referenceDate = [calendar dateFromComponents:comps];
// Get week day (starts at 1).
int weekday = [[calendar components:unitFlags fromDate:referenceDate] weekday] - 1;
if ([suppliedDate compare:referenceDate] == NSOrderedSame && i == 0) {
// Today
[formatter setDateStyle:NSDateFormatterNoStyle];
[formatter setTimeStyle:NSDateFormatterShortStyle];
break;
} else if ([suppliedDate compare:referenceDate] == NSOrderedSame && i == 1) {
// Yesterday
[formatter setDateStyle:NSDateFormatterNoStyle];
return @"Yesterday";
} else if ([suppliedDate compare:referenceDate] == NSOrderedSame) {
// Day of the week
return [[formatter weekdaySymbols] objectAtIndex:weekday];
}
}
// It's not in those eight days.
return [formatter stringFromDate:self];
}
- (NSString*)relativeFormattedDateOnly {
// Initialize the formatter.
NSDateFormatter* formatter = [[[NSDateFormatter alloc] init] autorelease];
[formatter setDateStyle:NSDateFormatterShortStyle];
[formatter setTimeStyle:NSDateFormatterNoStyle];
// Initialize the calendar and flags.
unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSWeekdayCalendarUnit;
NSCalendar* calendar = [NSCalendar currentCalendar];
// Create reference date for supplied date.
NSDateComponents *comps = [calendar components:unitFlags fromDate:self];
[comps setHour:0];
[comps setMinute:0];
[comps setSecond:0];
NSDate* suppliedDate = [calendar dateFromComponents:comps];
// Iterate through the eight days (tomorrow, today, and the last six).
int i;
for (i = -1; i < 7; i++) {
// Initialize reference date.
comps = [calendar components:unitFlags fromDate:[NSDate date]];
[comps setHour:0];
[comps setMinute:0];
[comps setSecond:0];
[comps setDay:[comps day] - i];
NSDate* referenceDate = [calendar dateFromComponents:comps];
// Get week day (starts at 1).
int weekday = [[calendar components:unitFlags fromDate:referenceDate] weekday] - 1;
if ([suppliedDate compare:referenceDate] == NSOrderedSame && i == 0) {
// Today
[formatter setDateStyle:NSDateFormatterNoStyle];
return @"Today";
} else if ([suppliedDate compare:referenceDate] == NSOrderedSame && i == 1) {
// Yesterday
[formatter setDateStyle:NSDateFormatterNoStyle];
return @"Yesterday";
} else if ([suppliedDate compare:referenceDate] == NSOrderedSame && i == -1) {
// Yesterday
[formatter setDateStyle:NSDateFormatterNoStyle];
return@"Tomorrow";
} else if ([suppliedDate compare:referenceDate] == NSOrderedSame) {
// Day of the week
return [[formatter weekdaySymbols] objectAtIndex:weekday];
}
}
// It's not in those eight days.
return [formatter stringFromDate:self];
}
- (NSString*)relativeFormattedDateTime {
// Initialize the formatter.
NSDateFormatter* formatter = [[[NSDateFormatter alloc] init] autorelease];
[formatter setDateStyle:NSDateFormatterShortStyle];
[formatter setTimeStyle:NSDateFormatterShortStyle];
[formatter setAMSymbol:@"am"];
[formatter setPMSymbol:@"pm"];
// Initialize the calendar and flags.
unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSWeekdayCalendarUnit;
NSCalendar* calendar = [NSCalendar currentCalendar];
// Create reference date for supplied date.
NSDateComponents *comps = [calendar components:unitFlags fromDate:self];
[comps setHour:0];
[comps setMinute:0];
[comps setSecond:0];
NSDate* suppliedDate = [calendar dateFromComponents:comps];
// Iterate through the eight days (tomorrow, today, and the last six).
int i;
for (i = -1; i < 7; i++) {
// Initialize reference date.
comps = [calendar components:unitFlags fromDate:[NSDate date]];
[comps setHour:0];
[comps setMinute:0];
[comps setSecond:0];
[comps setDay:[comps day] - i];
NSDate* referenceDate = [calendar dateFromComponents:comps];
// Get week day (starts at 1).
int weekday = [[calendar components:unitFlags fromDate:referenceDate] weekday] - 1;
if ([suppliedDate compare:referenceDate] == NSOrderedSame && i == 0) {
// Today
[formatter setDateStyle:NSDateFormatterNoStyle];
return [NSString stringWithFormat:@"Today, %@", [formatter stringFromDate:self]];
} else if ([suppliedDate compare:referenceDate] == NSOrderedSame && i == 1) {
// Yesterday
[formatter setDateStyle:NSDateFormatterNoStyle];
return [NSString stringWithFormat:@"Yesterday, %@", [formatter stringFromDate:self]];
} else if ([suppliedDate compare:referenceDate] == NSOrderedSame) {
// Day of the week
NSString* day = [[formatter weekdaySymbols] objectAtIndex:weekday];
[formatter setDateStyle:NSDateFormatterNoStyle];
return [NSString stringWithFormat:@"%@, %@", day, [formatter stringFromDate:self]];
}
}
// It's not in those eight days.
[formatter setDateStyle:NSDateFormatterShortStyle];
[formatter setTimeStyle:NSDateFormatterNoStyle];
NSString* date = [formatter stringFromDate:self];
[formatter setDateStyle:NSDateFormatterNoStyle];
[formatter setTimeStyle:NSDateFormatterShortStyle];
NSString* time = [formatter stringFromDate:self];
return [NSString stringWithFormat:@"%@, %@", date, time];
}
- (NSString*)relativeLongFormattedDate {
// Initialize the formatter.
NSDateFormatter* formatter = [[[NSDateFormatter alloc] init] autorelease];
[formatter setDateStyle:NSDateFormatterFullStyle];
[formatter setTimeStyle:NSDateFormatterNoStyle];
// Initialize the calendar and flags.
unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSWeekdayCalendarUnit;
NSCalendar* calendar = [NSCalendar currentCalendar];
// Create reference date for supplied date.
NSDateComponents *comps = [calendar components:unitFlags fromDate:self];
[comps setHour:0];
[comps setMinute:0];
[comps setSecond:0];
NSDate* suppliedDate = [calendar dateFromComponents:comps];
// Iterate through the eight days (tomorrow, today, and the last six).
int i;
for (i = -1; i < 7; i++) {
// Initialize reference date.
comps = [calendar components:unitFlags fromDate:[NSDate date]];
[comps setHour:0];
[comps setMinute:0];
[comps setSecond:0];
[comps setDay:[comps day] - i];
NSDate* referenceDate = [calendar dateFromComponents:comps];
// Get week day (starts at 1).
int weekday = [[calendar components:unitFlags fromDate:referenceDate] weekday] - 1;
if ([suppliedDate compare:referenceDate] == NSOrderedSame && i == 0) {
// Today
[formatter setDateStyle:NSDateFormatterNoStyle];
return @"Today";
} else if ([suppliedDate compare:referenceDate] == NSOrderedSame && i == 1) {
// Yesterday
[formatter setDateStyle:NSDateFormatterNoStyle];
return @"Yesterday";
} else if ([suppliedDate compare:referenceDate] == NSOrderedSame && i == -1) {
// Tomorrow
[formatter setDateStyle:NSDateFormatterNoStyle];
return @"Tomorrow";
} else if ([suppliedDate compare:referenceDate] == NSOrderedSame) {
// Day of the week
return [[formatter weekdaySymbols] objectAtIndex:weekday];
}
}
// It's not in those eight days.
return [formatter stringFromDate:self];
}
- (NSString*)formattedTime {
// Initialize the formatter.
NSDateFormatter* formatter = [[[NSDateFormatter alloc] init] autorelease];
[formatter setDateStyle:NSDateFormatterNoStyle];
[formatter setTimeStyle:NSDateFormatterShortStyle];
return [formatter stringFromDate:self];
}
- (NSString*)iso8601Formatted {
return [self formattedDateWithFormatString:@"yyyy-MM-dd'T'HH:mm:ssZ"];
}
- (BOOL)isPastDate {
NSDate* now = [NSDate date];
if([[now earlierDate:self] isEqualToDate:self]) {
return YES;
} else {
return NO;
}
}
-(NSDate*) dateOnly{
// start by retrieving day, weekday, month and year components for today
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *todayComponents = [gregorian components:(NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit) fromDate:self];
NSInteger theDay = [todayComponents day];
NSInteger theMonth = [todayComponents month];
NSInteger theYear = [todayComponents year];
// now build a NSDate object for the input date using these components
NSDateComponents *components = [[NSDateComponents alloc] init];
[components setDay:theDay];
[components setMonth:theMonth];
[components setYear:theYear];
NSDate *thisDate = [gregorian dateFromComponents:components];
[components release];
return thisDate;
}
@end