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 e887441..01f5ed0 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/CommitJsonData.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/CommitJsonData.java
@@ -19,12 +19,12 @@
 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;
 import org.eclipse.jgit.revwalk.RevCommit;
 import org.eclipse.jgit.revwalk.RevWalk;
-import org.eclipse.jgit.util.GitDateFormatter;
 
 import java.io.IOException;
 import java.util.List;
@@ -72,11 +72,11 @@
     return this;
   }
 
-  Commit toJsonData(HttpServletRequest req, RevCommit c, GitDateFormatter df) throws IOException {
+  Commit toJsonData(HttpServletRequest req, RevCommit c, DateFormatter df) throws IOException {
     return toJsonData(req, c, DEFAULT_FIELDS, df);
   }
 
-  Commit toJsonData(HttpServletRequest req, RevCommit c, Set<Field> fs, GitDateFormatter df)
+  Commit toJsonData(HttpServletRequest req, RevCommit c, Set<Field> fs, DateFormatter df)
       throws IOException {
     CommitData cd = new CommitData.Builder()
         .setRevWalk(walk)
@@ -107,11 +107,11 @@
     return result;
   }
 
-  private static Ident toJsonData(PersonIdent ident, GitDateFormatter df) {
+  private static Ident toJsonData(PersonIdent ident, DateFormatter df) {
     Ident result = new Ident();
     result.name = ident.getName();
     result.email = ident.getEmailAddress();
-    result.time = df.formatDate(ident);
+    result.time = df.format(ident);
     return result;
   }
 
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 8127d6d..3bb4f41 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/CommitSoyData.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/CommitSoyData.java
@@ -26,6 +26,7 @@
 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;
@@ -35,7 +36,6 @@
 import org.eclipse.jgit.lib.Ref;
 import org.eclipse.jgit.revwalk.RevCommit;
 import org.eclipse.jgit.revwalk.RevWalk;
-import org.eclipse.jgit.util.GitDateFormatter;
 import org.eclipse.jgit.util.RelativeDateFormatter;
 
 import java.io.IOException;
@@ -75,7 +75,7 @@
   }
 
   Map<String, Object> toSoyData(HttpServletRequest req, RevCommit c, Set<Field> fs,
-      GitDateFormatter df) throws IOException {
+      DateFormatter df) throws IOException {
     GitilesView view = ViewFilter.getView(req);
     CommitData cd = new CommitData.Builder()
         .setRevWalk(walk)
@@ -141,16 +141,16 @@
   }
 
   Map<String, Object> toSoyData(HttpServletRequest req, RevCommit commit,
-      GitDateFormatter df) throws IOException {
+      DateFormatter df) throws IOException {
     return toSoyData(req, commit, DEFAULT_FIELDS, df);
   }
 
   // TODO(dborowitz): Extract this.
-  public static Map<String, String> toSoyData(PersonIdent ident, GitDateFormatter df) {
+  public static Map<String, String> toSoyData(PersonIdent ident, DateFormatter df) {
     return ImmutableMap.of(
         "name", ident.getName(),
         "email", ident.getEmailAddress(),
-        "time", df.formatDate(ident),
+        "time", df.format(ident),
         // TODO(dborowitz): Switch from relative to absolute at some threshold.
         "relativeTime", RelativeDateFormatter.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
new file mode 100644
index 0000000..00d7372
--- /dev/null
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/DateFormatterBuilder.java
@@ -0,0 +1,87 @@
+// 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.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);
+      TimeZone tz = ident.getTimeZone();
+      if (tz == null) {
+        tz = SystemReader.getInstance().getTimeZone();
+      }
+      df.setTimeZone(tz);
+      return df.format(ident.getWhen());
+    }
+  }
+
+  private final ThreadLocal<List<DateFormat>> dfs;
+
+  DateFormatterBuilder() {
+    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) {
+      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 7af19e2..3be0af1 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/DiffServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/DiffServlet.java
@@ -19,6 +19,8 @@
 
 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 org.eclipse.jgit.diff.DiffFormatter;
 import org.eclipse.jgit.errors.IncorrectObjectTypeException;
@@ -34,8 +36,6 @@
 import org.eclipse.jgit.treewalk.EmptyTreeIterator;
 import org.eclipse.jgit.treewalk.TreeWalk;
 import org.eclipse.jgit.treewalk.filter.PathFilter;
-import org.eclipse.jgit.util.GitDateFormatter;
-import org.eclipse.jgit.util.GitDateFormatter.Format;
 
 import java.io.IOException;
 import java.io.OutputStream;
@@ -51,11 +51,13 @@
   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(GitilesAccess.Factory accessFactory, Renderer renderer,
-      Linkifier linkifier) {
+  public DiffServlet(DateFormatterBuilder dfb, GitilesAccess.Factory accessFactory,
+      Renderer renderer, Linkifier linkifier) {
     super(renderer, accessFactory);
+    this.dfb = checkNotNull(dfb, "dfb");
     this.linkifier = checkNotNull(linkifier, "linkifier");
   }
 
@@ -95,7 +97,7 @@
         if (isFile) {
           fs = Field.setOf(fs, Field.PARENT_BLAME_URL);
         }
-        GitDateFormatter df = new GitDateFormatter(Format.DEFAULT);
+        DateFormatter df = dfb.create(Format.DEFAULT);
         data.put("commit", new CommitSoyData()
             .setLinkifier(linkifier)
             .setArchiveFormat(getArchiveFormat(getAccess(req)))
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 5c765d8..34503c3 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/GitilesFilter.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/GitilesFilter.java
@@ -170,6 +170,7 @@
   private TimeCache timeCache;
   private BlameCache blameCache;
   private GitwebRedirectFilter gitwebRedirect;
+  private DateFormatterBuilder dateFormatterBuilder;
   private boolean initialized;
 
   GitilesFilter() {
@@ -238,23 +239,23 @@
       case HOST_INDEX:
         return new HostIndexServlet(accessFactory, renderer, urls);
       case REPOSITORY_INDEX:
-        return new RepositoryIndexServlet(accessFactory, renderer, timeCache);
+        return new RepositoryIndexServlet(accessFactory, renderer, dateFormatterBuilder, timeCache);
       case REFS:
         return new RefServlet(accessFactory, renderer, timeCache);
       case REVISION:
-        return new RevisionServlet(accessFactory, renderer, linkifier());
+        return new RevisionServlet(accessFactory, renderer, dateFormatterBuilder, linkifier());
       case PATH:
         return new PathServlet(accessFactory, renderer, urls);
       case DIFF:
-        return new DiffServlet(accessFactory, renderer, linkifier());
+        return new DiffServlet(dateFormatterBuilder, accessFactory, renderer, linkifier());
       case LOG:
-        return new LogServlet(accessFactory, renderer, linkifier());
+        return new LogServlet(accessFactory, renderer, dateFormatterBuilder, linkifier());
       case DESCRIBE:
         return new DescribeServlet(accessFactory);
       case ARCHIVE:
         return new ArchiveServlet(accessFactory);
       case BLAME:
-        return new BlameServlet(accessFactory, renderer, blameCache);
+        return new BlameServlet(accessFactory, renderer, dateFormatterBuilder, blameCache);
       default:
         throw new IllegalArgumentException("Invalid view type: " + view);
     }
@@ -310,6 +311,7 @@
     setDefaultTimeCache();
     setDefaultBlameCache();
     setDefaultGitwebRedirect();
+    setDefaultDateFormatterBuilder();
   }
 
   private void setDefaultConfig(FilterConfig filterConfig) throws ServletException {
@@ -419,6 +421,12 @@
     }
   }
 
+  private void setDefaultDateFormatterBuilder() {
+    if (dateFormatterBuilder == null) {
+      dateFormatterBuilder = new DateFormatterBuilder();
+    }
+  }
+
   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 e547563..c2fafbb 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/LogServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/LogServlet.java
@@ -25,6 +25,8 @@
 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.gson.reflect.TypeToken;
 
 import org.eclipse.jgit.errors.IncorrectObjectTypeException;
@@ -44,8 +46,6 @@
 import org.eclipse.jgit.treewalk.filter.AndTreeFilter;
 import org.eclipse.jgit.treewalk.filter.PathFilter;
 import org.eclipse.jgit.treewalk.filter.TreeFilter;
-import org.eclipse.jgit.util.GitDateFormatter;
-import org.eclipse.jgit.util.GitDateFormatter.Format;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -67,10 +67,13 @@
   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, Linkifier linkifier) {
+  public LogServlet(GitilesAccess.Factory accessFactory, Renderer renderer,
+      DateFormatterBuilder dfb, Linkifier linkifier) {
     super(renderer, accessFactory);
+    this.dfb = checkNotNull(dfb, "dfb");
     this.linkifier = checkNotNull(linkifier, "linkifier");
   }
 
@@ -85,7 +88,7 @@
     }
 
     try {
-      GitDateFormatter df = new GitDateFormatter(Format.DEFAULT);
+      DateFormatter df = dfb.create(Format.DEFAULT);
       Map<String, Object> data = new LogSoyData(req, view).toSoyData(paginator, null, df);
 
       if (!view.getRevision().nameIsId()) {
@@ -131,7 +134,7 @@
     }
 
     try {
-      GitDateFormatter df = new GitDateFormatter(Format.DEFAULT);
+      DateFormatter df = dfb.create(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 1c134cf..71cec89 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/LogSoyData.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/LogSoyData.java
@@ -19,11 +19,11 @@
 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;
 import org.eclipse.jgit.revwalk.RevWalk;
-import org.eclipse.jgit.util.GitDateFormatter;
 
 import java.io.IOException;
 import java.util.List;
@@ -45,12 +45,12 @@
   }
 
   public Map<String, Object> toSoyData(RevWalk walk, int limit, @Nullable String revision,
-      @Nullable ObjectId start, GitDateFormatter df) throws IOException {
+      @Nullable ObjectId start, DateFormatter df) throws IOException {
     return toSoyData(new Paginator(walk, limit, start), revision, df);
   }
 
   public Map<String, Object> toSoyData(Paginator paginator, @Nullable String revision,
-      GitDateFormatter df) throws IOException {
+      DateFormatter df) throws IOException {
     Map<String, Object> data = Maps.newHashMapWithExpectedSize(3);
 
     List<Map<String, Object>> entries = Lists.newArrayListWithCapacity(paginator.getLimit());
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 ec375ba..0df8aec 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/RepositoryIndexServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/RepositoryIndexServlet.java
@@ -20,6 +20,8 @@
 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 org.eclipse.jgit.http.server.ServletUtils;
 import org.eclipse.jgit.lib.Constants;
@@ -28,8 +30,6 @@
 import org.eclipse.jgit.revwalk.RevCommit;
 import org.eclipse.jgit.revwalk.RevObject;
 import org.eclipse.jgit.revwalk.RevWalk;
-import org.eclipse.jgit.util.GitDateFormatter;
-import org.eclipse.jgit.util.GitDateFormatter.Format;
 
 import java.io.IOException;
 import java.util.List;
@@ -45,11 +45,13 @@
   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,
-      TimeCache timeCache) {
+      DateFormatterBuilder dfb, TimeCache timeCache) {
     super(renderer, accessFactory);
+    this.dfb = checkNotNull(dfb, "dfb");
     this.timeCache = checkNotNull(timeCache, "timeCache");
   }
 
@@ -74,7 +76,7 @@
         if (head.getType() == Constants.OBJ_COMMIT) {
           walk.reset();
           walk.markStart((RevCommit) head);
-          GitDateFormatter df = new GitDateFormatter(Format.DEFAULT);
+          DateFormatter df = dfb.create(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 113a6f6..565cf76 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/RevisionServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/RevisionServlet.java
@@ -26,6 +26,8 @@
 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 org.eclipse.jgit.errors.IncorrectObjectTypeException;
 import org.eclipse.jgit.errors.MissingObjectException;
@@ -37,8 +39,6 @@
 import org.eclipse.jgit.revwalk.RevObject;
 import org.eclipse.jgit.revwalk.RevTag;
 import org.eclipse.jgit.revwalk.RevWalk;
-import org.eclipse.jgit.util.GitDateFormatter;
-import org.eclipse.jgit.util.GitDateFormatter.Format;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -59,11 +59,13 @@
   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,
-      Linkifier linkifier) {
+      DateFormatterBuilder dfb, Linkifier linkifier) {
     super(renderer, accessFactory);
+    this.dfb = checkNotNull(dfb, "dfb");
     this.linkifier = checkNotNull(linkifier, "linkifier");
   }
 
@@ -74,7 +76,7 @@
 
     RevWalk walk = new RevWalk(repo);
     try {
-      GitDateFormatter df = new GitDateFormatter(Format.DEFAULT);
+      DateFormatter df = dfb.create(Format.DEFAULT);
       List<RevObject> objects = listObjects(walk, view.getRevision());
       List<Map<String, ?>> soyObjects = Lists.newArrayListWithCapacity(objects.size());
       boolean hasBlob = false;
@@ -140,7 +142,7 @@
 
     RevWalk walk = new RevWalk(repo);
     try {
-      GitDateFormatter df = new GitDateFormatter(Format.DEFAULT);
+      DateFormatter df = dfb.create(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 9e8d871..e715cdd 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/TagSoyData.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/TagSoyData.java
@@ -15,10 +15,10 @@
 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;
-import org.eclipse.jgit.util.GitDateFormatter;
 
 import java.util.Map;
 
@@ -34,7 +34,7 @@
     this.req = req;
   }
 
-  public Map<String, Object> toSoyData(RevTag tag, GitDateFormatter df) {
+  public Map<String, Object> toSoyData(RevTag tag, DateFormatter df) {
     Map<String, Object> data = Maps.newHashMapWithExpectedSize(4);
     data.put("sha", ObjectId.toString(tag));
     if (tag.getTaggerIdent() != null) {
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 34c9016..1530916 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
@@ -15,7 +15,6 @@
 package com.google.gitiles.blame;
 
 import static com.google.common.base.Preconditions.checkNotNull;
-
 import static javax.servlet.http.HttpServletResponse.SC_NOT_FOUND;
 
 import com.google.common.base.Strings;
@@ -25,6 +24,9 @@
 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.GitilesAccess;
 import com.google.gitiles.GitilesView;
 import com.google.gitiles.Renderer;
@@ -41,8 +43,6 @@
 import org.eclipse.jgit.revwalk.RevCommit;
 import org.eclipse.jgit.revwalk.RevWalk;
 import org.eclipse.jgit.treewalk.TreeWalk;
-import org.eclipse.jgit.util.GitDateFormatter;
-import org.eclipse.jgit.util.GitDateFormatter.Format;
 
 import java.io.IOException;
 import java.util.List;
@@ -55,10 +55,13 @@
 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, BlameCache cache) {
+  public BlameServlet(GitilesAccess.Factory accessFactory, Renderer renderer,
+      DateFormatterBuilder dfb, BlameCache cache) {
     super(renderer, accessFactory);
+    this.dfb = checkNotNull(dfb, "dfb");
     this.cache = checkNotNull(cache, "cache");
   }
 
@@ -85,7 +88,7 @@
           res.setStatus(SC_NOT_FOUND);
           return;
         }
-        GitDateFormatter df = new GitDateFormatter(Format.ISO);
+        DateFormatter df = dfb.create(Format.ISO);
         renderHtml(req, res, "gitiles.blameDetail", ImmutableMap.of(
             "title", title,
             "breadcrumbs", view.getBreadcrumbs(),
@@ -129,7 +132,7 @@
   }
 
   private static SoyListData toSoyData(GitilesView view, ObjectReader reader,
-      List<Region> regions, GitDateFormatter df) throws IOException {
+      List<Region> regions, DateFormatter df) throws IOException {
     Map<ObjectId, String> abbrevShas = Maps.newHashMap();
     SoyListData result = new SoyListData();
 
diff --git a/gitiles-servlet/src/test/java/com/google/gitiles/DateFormatterBuilderTest.java b/gitiles-servlet/src/test/java/com/google/gitiles/DateFormatterBuilderTest.java
new file mode 100644
index 0000000..c730fa9
--- /dev/null
+++ b/gitiles-servlet/src/test/java/com/google/gitiles/DateFormatterBuilderTest.java
@@ -0,0 +1,56 @@
+// 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 static org.junit.Assert.assertEquals;
+
+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;
+import org.junit.Test;
+
+import java.text.ParseException;
+import java.util.Date;
+import java.util.TimeZone;
+
+public class DateFormatterBuilderTest {
+  @Test
+  public void defaultIncludingTimeZone() throws Exception {
+    DateFormatterBuilder dfb = new DateFormatterBuilder();
+    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));
+  }
+
+  @Test
+  public void isoIncludingTimeZone() throws Exception {
+    DateFormatterBuilder dfb = new DateFormatterBuilder();
+    PersonIdent ident = newIdent("Mon Jan 2 15:04:05 2006", "-0700");
+    assertEquals("2006-01-02 15:04:05 -0700", dfb.create(ISO).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);
+    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
+    // check is useful enough to keep around.
+    assertEquals("PersonIdent[A User, user@example.com, " + whenStr + "]", ident.toString());
+    return ident;
+  }
+}
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 f239b82..e5a821c 100644
--- a/gitiles-servlet/src/test/java/com/google/gitiles/RepositoryIndexServletTest.java
+++ b/gitiles-servlet/src/test/java/com/google/gitiles/RepositoryIndexServletTest.java
@@ -43,6 +43,7 @@
     servlet = new RepositoryIndexServlet(
         new TestGitilesAccess(repo.getRepository()),
         new DefaultRenderer(),
+        new DateFormatterBuilder(),
         new TimeCache());
   }
 
