Commits

Peter Hosey committed 05dc35d

Made this almost ten times as fast by holding onto the date formatter we use for unparsing.

Comments (0)

Files changed (2)

ISO8601DateFormatter.h

 
 @interface ISO8601DateFormatter: NSFormatter
 {
+	NSString *lastUsedFormatString;
+	NSDateFormatter *unparsingFormatter;
+
 	NSTimeZone *defaultTimeZone;
 	ISO8601DateFormat format;
 	unichar timeSeparator;

ISO8601DateFormatter.m

 }
 - (void) dealloc {
 	[defaultTimeZone release];
+
+	[unparsingFormatter release];
+	[lastUsedFormatString release];
+
 	[super dealloc];
 }
 
 	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];
+	}
 
-	NSString *str = [formatter stringForObjectValue:date];
+	if (!unparsingFormatter) {
+		NSCalendar *calendar = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
+		calendar.firstWeekday = 2; //Monday
 
-	[formatter release];
+		unparsingFormatter = [[NSDateFormatter alloc] init];
+		unparsingFormatter.formatterBehavior = NSDateFormatterBehavior10_4;
+		unparsingFormatter.dateFormat = dateFormat;
+		unparsingFormatter.calendar = calendar;
+	}
+
+	NSString *str = [unparsingFormatter stringForObjectValue:date];
 
 	if (includeTime) {
 		NSInteger offset = [timeZone secondsFromGMT];