Skip to content

Commit

Permalink
Made this almost ten times as fast by holding onto the date formatter…
Browse files Browse the repository at this point in the history
… we use for unparsing.
  • Loading branch information
Peter Hosey committed Oct 15, 2011
1 parent 7102507 commit 3fa0604
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 8 deletions.
3 changes: 3 additions & 0 deletions ISO8601DateFormatter.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,9 @@ extern unichar ISO8601DefaultTimeSeparatorCharacter;

@interface ISO8601DateFormatter: NSFormatter
{
NSString *lastUsedFormatString;
NSDateFormatter *unparsingFormatter;

NSTimeZone *defaultTimeZone;
ISO8601DateFormat format;
unichar timeSeparator;
Expand Down
28 changes: 20 additions & 8 deletions ISO8601DateFormatter.m
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,10 @@ - (id) init {
}
- (void) dealloc {
[defaultTimeZone release];

[unparsingFormatter release];
[lastUsedFormatString release];

[super dealloc];
}

Expand Down Expand Up @@ -636,17 +640,25 @@ - (NSString *) stringFromDate:(NSDate *)date formatString:(NSString *)dateFormat
if (includeTime)
dateFormat = [dateFormat stringByAppendingFormat:@"'T'%@", [self replaceColonsInString:ISO_TIME_FORMAT withTimeSeparator:self.timeSeparator]];

NSCalendar *calendar = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
calendar.firstWeekday = 2; //Monday
if (dateFormat != lastUsedFormatString) {
[unparsingFormatter release];
unparsingFormatter = nil;

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.formatterBehavior = NSDateFormatterBehavior10_4;
formatter.dateFormat = dateFormat;
formatter.calendar = calendar;
[lastUsedFormatString release];
lastUsedFormatString = [dateFormat retain];
}

if (!unparsingFormatter) {
NSCalendar *calendar = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
calendar.firstWeekday = 2; //Monday

NSString *str = [formatter stringForObjectValue:date];
unparsingFormatter = [[NSDateFormatter alloc] init];
unparsingFormatter.formatterBehavior = NSDateFormatterBehavior10_4;
unparsingFormatter.dateFormat = dateFormat;
unparsingFormatter.calendar = calendar;
}

[formatter release];
NSString *str = [unparsingFormatter stringForObjectValue:date];

if (includeTime) {
NSInteger offset = [timeZone secondsFromGMT];
Expand Down

0 comments on commit 3fa0604

Please sign in to comment.