Peter Hosey avatar 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];
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.