diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/CommitJsonData.java b/gitiles-servlet/src/main/java/com/google/gitiles/CommitJsonData.java
index 99e7980..86141c3 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/CommitJsonData.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/CommitJsonData.java
@@ -20,7 +20,6 @@
 import com.google.common.collect.Sets;
 import com.google.gitiles.CommitData.DiffList;
 import com.google.gitiles.CommitData.Field;
-import com.google.gitiles.DateFormatterBuilder.DateFormatter;
 
 import org.eclipse.jgit.diff.DiffEntry;
 import org.eclipse.jgit.lib.PersonIdent;
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/CommitSoyData.java b/gitiles-servlet/src/main/java/com/google/gitiles/CommitSoyData.java
index 3bb4f41..045e499 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/CommitSoyData.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/CommitSoyData.java
@@ -26,7 +26,6 @@
 import com.google.common.collect.Sets;
 import com.google.gitiles.CommitData.DiffList;
 import com.google.gitiles.CommitData.Field;
-import com.google.gitiles.DateFormatterBuilder.DateFormatter;
 import com.google.template.soy.data.restricted.NullData;
 
 import org.eclipse.jgit.diff.DiffEntry;
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/ConfigUtil.java b/gitiles-servlet/src/main/java/com/google/gitiles/ConfigUtil.java
index 4f8733b..e4dc44d 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/ConfigUtil.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/ConfigUtil.java
@@ -14,6 +14,7 @@
 
 package com.google.gitiles;
 
+import com.google.common.base.Optional;
 import com.google.common.base.Predicates;
 import com.google.common.cache.CacheBuilder;
 import com.google.common.collect.ImmutableList;
@@ -22,6 +23,7 @@
 import org.eclipse.jgit.lib.Config;
 import org.joda.time.Duration;
 
+import java.util.TimeZone;
 import java.util.concurrent.TimeUnit;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -127,6 +129,24 @@
     return b;
   }
 
+  /**
+   * Get a {@link TimeZone} from a config.
+   *
+   * @param config JGit config object.
+   * @param section section to read, e.g. "gitiles".
+   * @param subsection subsection to read, e.g. "subsection".
+   * @param name variable to read, e.g. "fixedTimeZone".
+   * @return a time zone read from parsing the specified config string value, or
+   *     {@link Optional#absent()} if not present. As in the behavior of
+   *     {@link TimeZone#getTimeZone(String)}, unknown time zones are treated as
+   *     GMT.
+   */
+  public static Optional<TimeZone> getTimeZone(Config config, String section, String subsection,
+      String name) {
+    String id = config.getString(section, subsection, name);
+    return id != null ? Optional.of(TimeZone.getTimeZone(id)) : Optional.<TimeZone> absent();
+  }
+
   private static Matcher matcher(String pattern, String valStr) {
       return Pattern.compile(pattern).matcher(valStr);
   }
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/DateFormatter.java b/gitiles-servlet/src/main/java/com/google/gitiles/DateFormatter.java
new file mode 100644
index 0000000..e7a2828
--- /dev/null
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/DateFormatter.java
@@ -0,0 +1,88 @@
+// Copyright (C) 2014 Google Inc. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.gitiles;
+
+import com.google.common.base.Optional;
+
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.util.SystemReader;
+
+import java.io.IOException;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.TimeZone;
+
+/** Date formatter similar in spirit to JGit's {@code GitDateFormatter}. */
+public class DateFormatter {
+  public static enum Format {
+    // Format strings should match org.eclipse.jgit.util.GitDateFormatter except
+    // for the timezone suffix.
+    DEFAULT("EEE MMM dd HH:mm:ss yyyy"),
+    ISO("yyyy-MM-dd HH:mm:ss");
+
+    private final String fmt;
+    private final ThreadLocal<DateFormat> defaultFormat;
+    private final ThreadLocal<DateFormat> fixedTzFormat;
+
+    private Format(String fmt) {
+      this.fmt = fmt;
+      this.defaultFormat = new ThreadLocal<>();
+      this.fixedTzFormat = new ThreadLocal<>();
+    }
+
+    private DateFormat getDateFormat(Optional<TimeZone> fixedTz) {
+      DateFormat df;
+      if (fixedTz.isPresent()) {
+        df = fixedTzFormat.get();
+        if (df == null) {
+          df = new SimpleDateFormat(fmt);
+          fixedTzFormat.set(df);
+        }
+        df.setTimeZone(fixedTz.get());
+      } else {
+        df = defaultFormat.get();
+        if (df == null) {
+          df = new SimpleDateFormat(fmt + " Z");
+          defaultFormat.set(df);
+        }
+      }
+      return df;
+    }
+  }
+
+  private final Optional<TimeZone> fixedTz;
+  private final Format format;
+
+  public DateFormatter(Optional<TimeZone> fixedTz, Format format) {
+    this.fixedTz = fixedTz;
+    this.format = format;
+  }
+
+  public DateFormatter(GitilesAccess access, Format format) throws IOException {
+    this(ConfigUtil.getTimeZone(access.getConfig(), "gitiles", null, "fixedTimeZone"), format);
+  }
+
+  public String format(PersonIdent ident) {
+    DateFormat df = format.getDateFormat(fixedTz);
+    if (!fixedTz.isPresent()) {
+      TimeZone tz = ident.getTimeZone();
+      if (tz == null) {
+        tz = SystemReader.getInstance().getTimeZone();
+      }
+      df.setTimeZone(tz);
+    }
+    return df.format(ident.getWhen());
+  }
+}
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/DateFormatterBuilder.java b/gitiles-servlet/src/main/java/com/google/gitiles/DateFormatterBuilder.java
deleted file mode 100644
index e7c0549..0000000
--- a/gitiles-servlet/src/main/java/com/google/gitiles/DateFormatterBuilder.java
+++ /dev/null
@@ -1,97 +0,0 @@
-// Copyright (C) 2014 Google Inc. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.gitiles;
-
-import com.google.common.base.Optional;
-import com.google.common.collect.Lists;
-
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.util.SystemReader;
-
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
-import java.util.List;
-import java.util.TimeZone;
-
-/** Date formatter similar in spirit to JGit's {@code GitDateFormatter}. */
-public class DateFormatterBuilder {
-  public static enum Format {
-    // Format strings should match org.eclipse.jgit.util.GitDateFormatter except
-    // for the timezone suffix.
-    DEFAULT("EEE MMM dd HH:mm:ss yyyy"),
-    ISO("yyyy-MM-dd HH:mm:ss");
-
-    private final String fmt;
-
-    private Format(String fmt) {
-      this.fmt = fmt;
-    }
-  }
-
-  public class DateFormatter {
-    private final Format format;
-
-    private DateFormatter(Format format) {
-      this.format = format;
-    }
-
-    public String format(PersonIdent ident) {
-      DateFormat df = getDateFormat(format);
-      if (!fixedTz.isPresent()) {
-        TimeZone tz = ident.getTimeZone();
-        if (tz == null) {
-          tz = SystemReader.getInstance().getTimeZone();
-        }
-        df.setTimeZone(tz);
-      }
-      return df.format(ident.getWhen());
-    }
-  }
-
-  private final Optional<TimeZone> fixedTz;
-  private final ThreadLocal<List<DateFormat>> dfs;
-
-  DateFormatterBuilder(Optional<TimeZone> fixedTz) {
-    this.fixedTz = fixedTz;
-    this.dfs = new ThreadLocal<List<DateFormat>>();
-  }
-
-  public DateFormatter create(Format format) {
-    return new DateFormatter(format);
-  }
-
-  private DateFormat getDateFormat(Format format) {
-    List<DateFormat> result = dfs.get();
-    if (result == null) {
-      int n = Format.values().length;
-      result = Lists.newArrayListWithCapacity(n);
-      for (int i = 0; i < n; i++) {
-        result.add(null);
-      }
-      dfs.set(result);
-    }
-    DateFormat df = result.get(format.ordinal());
-    if (df == null) {
-      if (fixedTz.isPresent()) {
-        df = new SimpleDateFormat(format.fmt);
-        df.setTimeZone(fixedTz.get());
-      } else {
-        df = new SimpleDateFormat(format.fmt + " Z");
-      }
-      result.set(format.ordinal(), df);
-    }
-    return result.get(format.ordinal());
-  }
-}
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/DiffServlet.java b/gitiles-servlet/src/main/java/com/google/gitiles/DiffServlet.java
index 3be0af1..aa95dec 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/DiffServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/DiffServlet.java
@@ -19,8 +19,7 @@
 
 import com.google.common.base.Charsets;
 import com.google.gitiles.CommitData.Field;
-import com.google.gitiles.DateFormatterBuilder.DateFormatter;
-import com.google.gitiles.DateFormatterBuilder.Format;
+import com.google.gitiles.DateFormatter.Format;
 
 import org.eclipse.jgit.diff.DiffFormatter;
 import org.eclipse.jgit.errors.IncorrectObjectTypeException;
@@ -51,13 +50,10 @@
   private static final long serialVersionUID = 1L;
   private static final String PLACEHOLDER = "id=\"DIFF_OUTPUT_BLOCK\"";
 
-  private final DateFormatterBuilder dfb;
   private final Linkifier linkifier;
 
-  public DiffServlet(DateFormatterBuilder dfb, GitilesAccess.Factory accessFactory,
-      Renderer renderer, Linkifier linkifier) {
+  public DiffServlet(GitilesAccess.Factory accessFactory, Renderer renderer, Linkifier linkifier) {
     super(renderer, accessFactory);
-    this.dfb = checkNotNull(dfb, "dfb");
     this.linkifier = checkNotNull(linkifier, "linkifier");
   }
 
@@ -97,10 +93,11 @@
         if (isFile) {
           fs = Field.setOf(fs, Field.PARENT_BLAME_URL);
         }
-        DateFormatter df = dfb.create(Format.DEFAULT);
+        GitilesAccess access = getAccess(req);
+        DateFormatter df = new DateFormatter(access, Format.DEFAULT);
         data.put("commit", new CommitSoyData()
             .setLinkifier(linkifier)
-            .setArchiveFormat(getArchiveFormat(getAccess(req)))
+            .setArchiveFormat(getArchiveFormat(access))
             .toSoyData(req, walk.parseCommit(view.getRevision().getId()), fs, df));
       }
       if (!data.containsKey("repositoryName") && (view.getRepositoryName() != null)) {
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/GitilesFilter.java b/gitiles-servlet/src/main/java/com/google/gitiles/GitilesFilter.java
index e4de1c0..5c765d8 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/GitilesFilter.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/GitilesFilter.java
@@ -21,7 +21,6 @@
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Objects;
-import com.google.common.base.Optional;
 import com.google.common.collect.FluentIterable;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.LinkedListMultimap;
@@ -51,7 +50,6 @@
 import java.util.Arrays;
 import java.util.Iterator;
 import java.util.Map;
-import java.util.TimeZone;
 import java.util.regex.Pattern;
 
 import javax.servlet.Filter;
@@ -172,7 +170,6 @@
   private TimeCache timeCache;
   private BlameCache blameCache;
   private GitwebRedirectFilter gitwebRedirect;
-  private DateFormatterBuilder dateFormatterBuilder;
   private boolean initialized;
 
   GitilesFilter() {
@@ -241,23 +238,23 @@
       case HOST_INDEX:
         return new HostIndexServlet(accessFactory, renderer, urls);
       case REPOSITORY_INDEX:
-        return new RepositoryIndexServlet(accessFactory, renderer, dateFormatterBuilder, timeCache);
+        return new RepositoryIndexServlet(accessFactory, renderer, timeCache);
       case REFS:
         return new RefServlet(accessFactory, renderer, timeCache);
       case REVISION:
-        return new RevisionServlet(accessFactory, renderer, dateFormatterBuilder, linkifier());
+        return new RevisionServlet(accessFactory, renderer, linkifier());
       case PATH:
         return new PathServlet(accessFactory, renderer, urls);
       case DIFF:
-        return new DiffServlet(dateFormatterBuilder, accessFactory, renderer, linkifier());
+        return new DiffServlet(accessFactory, renderer, linkifier());
       case LOG:
-        return new LogServlet(accessFactory, renderer, dateFormatterBuilder, linkifier());
+        return new LogServlet(accessFactory, renderer, linkifier());
       case DESCRIBE:
         return new DescribeServlet(accessFactory);
       case ARCHIVE:
         return new ArchiveServlet(accessFactory);
       case BLAME:
-        return new BlameServlet(accessFactory, renderer, dateFormatterBuilder, blameCache);
+        return new BlameServlet(accessFactory, renderer, blameCache);
       default:
         throw new IllegalArgumentException("Invalid view type: " + view);
     }
@@ -313,7 +310,6 @@
     setDefaultTimeCache();
     setDefaultBlameCache();
     setDefaultGitwebRedirect();
-    setDefaultDateFormatterBuilder();
   }
 
   private void setDefaultConfig(FilterConfig filterConfig) throws ServletException {
@@ -423,19 +419,6 @@
     }
   }
 
-  private void setDefaultDateFormatterBuilder() {
-    if (dateFormatterBuilder == null) {
-      String tzStr = config.getString("gitiles", null, "fixedTimeZone");
-      Optional<TimeZone> tz;
-      if (tzStr == null) {
-        tz = Optional.absent();
-      } else {
-        tz = Optional.of(TimeZone.getTimeZone(tzStr));
-      }
-      dateFormatterBuilder = new DateFormatterBuilder(tz);
-    }
-  }
-
   private static String getBaseGitUrl(Config config) throws ServletException {
     String baseGitUrl = config.getString("gitiles", null, "baseGitUrl");
     if (baseGitUrl == null) {
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/LogServlet.java b/gitiles-servlet/src/main/java/com/google/gitiles/LogServlet.java
index c2fafbb..e442be5 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/LogServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/LogServlet.java
@@ -25,8 +25,7 @@
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.google.common.primitives.Longs;
-import com.google.gitiles.DateFormatterBuilder.DateFormatter;
-import com.google.gitiles.DateFormatterBuilder.Format;
+import com.google.gitiles.DateFormatter.Format;
 import com.google.gson.reflect.TypeToken;
 
 import org.eclipse.jgit.errors.IncorrectObjectTypeException;
@@ -67,13 +66,10 @@
   private static final int DEFAULT_LIMIT = 100;
   private static final int MAX_LIMIT = 10000;
 
-  private final DateFormatterBuilder dfb;
   private final Linkifier linkifier;
 
-  public LogServlet(GitilesAccess.Factory accessFactory, Renderer renderer,
-      DateFormatterBuilder dfb, Linkifier linkifier) {
+  public LogServlet(GitilesAccess.Factory accessFactory, Renderer renderer, Linkifier linkifier) {
     super(renderer, accessFactory);
-    this.dfb = checkNotNull(dfb, "dfb");
     this.linkifier = checkNotNull(linkifier, "linkifier");
   }
 
@@ -88,7 +84,8 @@
     }
 
     try {
-      DateFormatter df = dfb.create(Format.DEFAULT);
+      GitilesAccess access = getAccess(req);
+      DateFormatter df = new DateFormatter(access, Format.DEFAULT);
       Map<String, Object> data = new LogSoyData(req, view).toSoyData(paginator, null, df);
 
       if (!view.getRevision().nameIsId()) {
@@ -111,7 +108,7 @@
       }
 
       data.put("title", title);
-      GitilesConfig.putVariant(getAccess(req).getConfig(), "logEntry", "logEntryVariant", data);
+      GitilesConfig.putVariant(access.getConfig(), "logEntry", "logEntryVariant", data);
 
       renderHtml(req, res, "gitiles.logDetail", data);
     } catch (RevWalkException e) {
@@ -134,7 +131,7 @@
     }
 
     try {
-      DateFormatter df = dfb.create(Format.DEFAULT);
+      DateFormatter df = new DateFormatter(getAccess(req), Format.DEFAULT);
       Map<String, Object> result = Maps.newLinkedHashMap();
       List<CommitJsonData.Commit> entries = Lists.newArrayListWithCapacity(paginator.getLimit());
       for (RevCommit c : paginator) {
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/LogSoyData.java b/gitiles-servlet/src/main/java/com/google/gitiles/LogSoyData.java
index 71cec89..a4be388 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/LogSoyData.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/LogSoyData.java
@@ -19,7 +19,6 @@
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
 import com.google.gitiles.CommitData.Field;
-import com.google.gitiles.DateFormatterBuilder.DateFormatter;
 
 import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.revwalk.RevCommit;
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/RepositoryIndexServlet.java b/gitiles-servlet/src/main/java/com/google/gitiles/RepositoryIndexServlet.java
index 0df8aec..7dde342 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/RepositoryIndexServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/RepositoryIndexServlet.java
@@ -20,8 +20,7 @@
 import com.google.common.base.Strings;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Maps;
-import com.google.gitiles.DateFormatterBuilder.DateFormatter;
-import com.google.gitiles.DateFormatterBuilder.Format;
+import com.google.gitiles.DateFormatter.Format;
 
 import org.eclipse.jgit.http.server.ServletUtils;
 import org.eclipse.jgit.lib.Constants;
@@ -45,13 +44,11 @@
   static final int REF_LIMIT = 10;
   private static final int LOG_LIMIT = 20;
 
-  private final DateFormatterBuilder dfb;
   private final TimeCache timeCache;
 
   public RepositoryIndexServlet(GitilesAccess.Factory accessFactory, Renderer renderer,
-      DateFormatterBuilder dfb, TimeCache timeCache) {
+      TimeCache timeCache) {
     super(renderer, accessFactory);
-    this.dfb = checkNotNull(dfb, "dfb");
     this.timeCache = checkNotNull(timeCache, "timeCache");
   }
 
@@ -64,7 +61,8 @@
   Map<String, ?> buildData(HttpServletRequest req) throws IOException {
     GitilesView view = ViewFilter.getView(req);
     Repository repo = ServletUtils.getRepository(req);
-    RepositoryDescription desc = getAccess(req).getRepositoryDescription();
+    GitilesAccess access = getAccess(req);
+    RepositoryDescription desc = access.getRepositoryDescription();
     RevWalk walk = new RevWalk(repo);
     List<Map<String, Object>> tags;
     Map<String, Object> data;
@@ -76,7 +74,7 @@
         if (head.getType() == Constants.OBJ_COMMIT) {
           walk.reset();
           walk.markStart((RevCommit) head);
-          DateFormatter df = dfb.create(Format.DEFAULT);
+          DateFormatter df = new DateFormatter(access, Format.DEFAULT);
           data = new LogSoyData(req, view).toSoyData(walk, LOG_LIMIT, "HEAD", null, df);
         } else {
           // TODO(dborowitz): Handle non-commit or missing HEAD?
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/RevisionServlet.java b/gitiles-servlet/src/main/java/com/google/gitiles/RevisionServlet.java
index 565cf76..987ade8 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/RevisionServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/RevisionServlet.java
@@ -26,8 +26,7 @@
 import com.google.common.collect.Lists;
 import com.google.gitiles.CommitData.Field;
 import com.google.gitiles.CommitJsonData.Commit;
-import com.google.gitiles.DateFormatterBuilder.DateFormatter;
-import com.google.gitiles.DateFormatterBuilder.Format;
+import com.google.gitiles.DateFormatter.Format;
 
 import org.eclipse.jgit.errors.IncorrectObjectTypeException;
 import org.eclipse.jgit.errors.MissingObjectException;
@@ -59,13 +58,11 @@
   private static final long serialVersionUID = 1L;
   private static final Logger log = LoggerFactory.getLogger(RevisionServlet.class);
 
-  private final DateFormatterBuilder dfb;
   private final Linkifier linkifier;
 
   public RevisionServlet(GitilesAccess.Factory accessFactory, Renderer renderer,
-      DateFormatterBuilder dfb, Linkifier linkifier) {
+      Linkifier linkifier) {
     super(renderer, accessFactory);
-    this.dfb = checkNotNull(dfb, "dfb");
     this.linkifier = checkNotNull(linkifier, "linkifier");
   }
 
@@ -73,10 +70,11 @@
   protected void doGetHtml(HttpServletRequest req, HttpServletResponse res) throws IOException {
     GitilesView view = ViewFilter.getView(req);
     Repository repo = ServletUtils.getRepository(req);
+    GitilesAccess access = getAccess(req);
 
     RevWalk walk = new RevWalk(repo);
     try {
-      DateFormatter df = dfb.create(Format.DEFAULT);
+      DateFormatter df = new DateFormatter(access, Format.DEFAULT);
       List<RevObject> objects = listObjects(walk, view.getRevision());
       List<Map<String, ?>> soyObjects = Lists.newArrayListWithCapacity(objects.size());
       boolean hasBlob = false;
@@ -91,7 +89,7 @@
                   "data", new CommitSoyData()
                       .setLinkifier(linkifier)
                       .setRevWalk(walk)
-                      .setArchiveFormat(getArchiveFormat(getAccess(req)))
+                      .setArchiveFormat(getArchiveFormat(access))
                       .toSoyData(req, (RevCommit) obj, COMMIT_SOY_FIELDS, df)));
               break;
             case OBJ_TREE:
@@ -142,7 +140,7 @@
 
     RevWalk walk = new RevWalk(repo);
     try {
-      DateFormatter df = dfb.create(Format.DEFAULT);
+      DateFormatter df = new DateFormatter(getAccess(req), Format.DEFAULT);
       RevObject obj = walk.parseAny(view.getRevision().getId());
       switch (obj.getType()) {
         case OBJ_COMMIT:
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/TagSoyData.java b/gitiles-servlet/src/main/java/com/google/gitiles/TagSoyData.java
index e715cdd..8401551 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/TagSoyData.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/TagSoyData.java
@@ -15,7 +15,6 @@
 package com.google.gitiles;
 
 import com.google.common.collect.Maps;
-import com.google.gitiles.DateFormatterBuilder.DateFormatter;
 
 import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.revwalk.RevTag;
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/blame/BlameServlet.java b/gitiles-servlet/src/main/java/com/google/gitiles/blame/BlameServlet.java
index 1530916..2b37f47 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/blame/BlameServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/blame/BlameServlet.java
@@ -24,9 +24,8 @@
 import com.google.gitiles.BaseServlet;
 import com.google.gitiles.BlobSoyData;
 import com.google.gitiles.CommitSoyData;
-import com.google.gitiles.DateFormatterBuilder;
-import com.google.gitiles.DateFormatterBuilder.DateFormatter;
-import com.google.gitiles.DateFormatterBuilder.Format;
+import com.google.gitiles.DateFormatter;
+import com.google.gitiles.DateFormatter.Format;
 import com.google.gitiles.GitilesAccess;
 import com.google.gitiles.GitilesView;
 import com.google.gitiles.Renderer;
@@ -55,13 +54,10 @@
 public class BlameServlet extends BaseServlet {
   private static final long serialVersionUID = 1L;
 
-  private final DateFormatterBuilder dfb;
   private final BlameCache cache;
 
-  public BlameServlet(GitilesAccess.Factory accessFactory, Renderer renderer,
-      DateFormatterBuilder dfb, BlameCache cache) {
+  public BlameServlet(GitilesAccess.Factory accessFactory, Renderer renderer, BlameCache cache) {
     super(renderer, accessFactory);
-    this.dfb = checkNotNull(dfb, "dfb");
     this.cache = checkNotNull(cache, "cache");
   }
 
@@ -88,7 +84,7 @@
           res.setStatus(SC_NOT_FOUND);
           return;
         }
-        DateFormatter df = dfb.create(Format.ISO);
+        DateFormatter df = new DateFormatter(getAccess(req), Format.ISO);
         renderHtml(req, res, "gitiles.blameDetail", ImmutableMap.of(
             "title", title,
             "breadcrumbs", view.getBreadcrumbs(),
diff --git a/gitiles-servlet/src/test/java/com/google/gitiles/DateFormatterBuilderTest.java b/gitiles-servlet/src/test/java/com/google/gitiles/DateFormatterTest.java
similarity index 63%
rename from gitiles-servlet/src/test/java/com/google/gitiles/DateFormatterBuilderTest.java
rename to gitiles-servlet/src/test/java/com/google/gitiles/DateFormatterTest.java
index 915a9ef..2431fbb 100644
--- a/gitiles-servlet/src/test/java/com/google/gitiles/DateFormatterBuilderTest.java
+++ b/gitiles-servlet/src/test/java/com/google/gitiles/DateFormatterTest.java
@@ -14,11 +14,12 @@
 
 package com.google.gitiles;
 
+import static com.google.gitiles.DateFormatter.Format.DEFAULT;
+import static com.google.gitiles.DateFormatter.Format.ISO;
+import static java.util.TimeZone.getTimeZone;
 import static org.junit.Assert.assertEquals;
 
 import com.google.common.base.Optional;
-import static com.google.gitiles.DateFormatterBuilder.Format.DEFAULT;
-import static com.google.gitiles.DateFormatterBuilder.Format.ISO;
 
 import org.eclipse.jgit.lib.PersonIdent;
 import org.eclipse.jgit.util.GitDateParser;
@@ -28,59 +29,53 @@
 import java.util.Date;
 import java.util.TimeZone;
 
-public class DateFormatterBuilderTest {
+public class DateFormatterTest {
   @Test
   public void defaultIncludingTimeZone() throws Exception {
-    DateFormatterBuilder dfb =
-        new DateFormatterBuilder(Optional.<TimeZone> absent());
     PersonIdent ident = newIdent("Mon Jan 2 15:04:05 2006", "-0700");
-    assertEquals("Mon Jan 02 15:04:05 2006 -0700", dfb.create(DEFAULT).format(ident));
+    DateFormatter df = new DateFormatter(Optional.<TimeZone> absent(), DEFAULT);
+    assertEquals("Mon Jan 02 15:04:05 2006 -0700", df.format(ident));
   }
 
   @Test
   public void defaultWithUtc() throws Exception {
-    DateFormatterBuilder dfb =
-        new DateFormatterBuilder(Optional.of(TimeZone.getTimeZone("UTC")));
     PersonIdent ident = newIdent("Mon Jan 2 15:04:05 2006", "-0700");
-    assertEquals("Mon Jan 02 22:04:05 2006", dfb.create(DEFAULT).format(ident));
+    DateFormatter df = new DateFormatter(Optional.of(getTimeZone("UTC")), DEFAULT);
+    assertEquals("Mon Jan 02 22:04:05 2006", df.format(ident));
   }
 
   @Test
   public void defaultWithOtherTimeZone() throws Exception {
-    DateFormatterBuilder dfb =
-        new DateFormatterBuilder(Optional.of(TimeZone.getTimeZone("GMT-0400")));
     PersonIdent ident = newIdent("Mon Jan 2 15:04:05 2006", "-0700");
-    assertEquals("Mon Jan 02 18:04:05 2006", dfb.create(DEFAULT).format(ident));
+    DateFormatter df = new DateFormatter(Optional.of(getTimeZone("GMT-0400")), DEFAULT);
+    assertEquals("Mon Jan 02 18:04:05 2006", df.format(ident));
   }
 
   @Test
   public void isoIncludingTimeZone() throws Exception {
-    DateFormatterBuilder dfb =
-        new DateFormatterBuilder(Optional.<TimeZone> absent());
     PersonIdent ident = newIdent("Mon Jan 2 15:04:05 2006", "-0700");
-    assertEquals("2006-01-02 15:04:05 -0700", dfb.create(ISO).format(ident));
+    DateFormatter df = new DateFormatter(Optional.<TimeZone> absent(), ISO);
+    assertEquals("2006-01-02 15:04:05 -0700", df.format(ident));
   }
 
   @Test
   public void isoWithUtc() throws Exception {
-    DateFormatterBuilder dfb =
-        new DateFormatterBuilder(Optional.of(TimeZone.getTimeZone("UTC")));
     PersonIdent ident = newIdent("Mon Jan 2 15:04:05 2006", "-0700");
-    assertEquals("2006-01-02 22:04:05", dfb.create(ISO).format(ident));
+    DateFormatter df = new DateFormatter(Optional.of(getTimeZone("UTC")), ISO);
+    assertEquals("2006-01-02 22:04:05", df.format(ident));
   }
 
   @Test
   public void isoWithOtherTimeZone() throws Exception {
-    DateFormatterBuilder dfb =
-        new DateFormatterBuilder(Optional.of(TimeZone.getTimeZone("GMT-0400")));
     PersonIdent ident = newIdent("Mon Jan 2 15:04:05 2006", "-0700");
-    assertEquals("2006-01-02 18:04:05", dfb.create(ISO).format(ident));
+    DateFormatter df = new DateFormatter(Optional.of(getTimeZone("GMT-0400")), ISO);
+    assertEquals("2006-01-02 18:04:05", df.format(ident));
   }
 
   private PersonIdent newIdent(String whenStr, String tzStr) throws ParseException {
     whenStr += " " + tzStr;
     Date when = GitDateParser.parse(whenStr, null);
-    TimeZone tz = TimeZone.getTimeZone("GMT" + tzStr);
+    TimeZone tz = getTimeZone("GMT" + tzStr);
     PersonIdent ident = new PersonIdent("A User", "user@example.com", when, tz);
     // PersonIdent.toString() uses its own format with "d" instead of "dd",
     // hence the mismatches in 2 vs. 02 above. Nonetheless I think this sanity
diff --git a/gitiles-servlet/src/test/java/com/google/gitiles/RepositoryIndexServletTest.java b/gitiles-servlet/src/test/java/com/google/gitiles/RepositoryIndexServletTest.java
index dff8f57..f239b82 100644
--- a/gitiles-servlet/src/test/java/com/google/gitiles/RepositoryIndexServletTest.java
+++ b/gitiles-servlet/src/test/java/com/google/gitiles/RepositoryIndexServletTest.java
@@ -16,7 +16,6 @@
 
 import static com.google.gitiles.TestGitilesUrls.URLS;
 
-import com.google.common.base.Optional;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 
@@ -29,7 +28,6 @@
 
 import java.io.IOException;
 import java.util.Map;
-import java.util.TimeZone;
 
 import javax.servlet.http.HttpServletRequest;
 
@@ -45,7 +43,6 @@
     servlet = new RepositoryIndexServlet(
         new TestGitilesAccess(repo.getRepository()),
         new DefaultRenderer(),
-        new DateFormatterBuilder(Optional.<TimeZone> absent()),
         new TimeCache());
   }
 
