Added system property to override generation time (useful to prevent meaningless differences when comparing outputs for testing)
diff --git a/src/main/org/freemarker/docgen/Transform.java b/src/main/org/freemarker/docgen/Transform.java
index 9916bcb..88fffd9 100644
--- a/src/main/org/freemarker/docgen/Transform.java
+++ b/src/main/org/freemarker/docgen/Transform.java
@@ -79,6 +79,8 @@
 import freemarker.template.TemplateModelException;
 import freemarker.template.TemplateScalarModel;
 import freemarker.template.utility.ClassUtil;
+import freemarker.template.utility.DateUtil;
+import freemarker.template.utility.DateUtil.DateParseException;
 import freemarker.template.utility.StringUtil;
 
 /**
@@ -578,6 +580,8 @@
 
     private static final Charset UTF_8 = Charset.forName("UTF-8");
 
+    static final String SYSPROP_GENERATION_TIME = "docgen.generationTime";
+    
     // Docgen-specific XML attributes (added during DOM-tree postediting):
 
     /**
@@ -1316,8 +1320,23 @@
                     VAR_ROOT_ELEMENT, doc.getDocumentElement());
 
             // Calculated data:
-            fmConfig.setSharedVariable(
-                    VAR_TRANSFORM_START_TIME, new Date());
+            {
+                Date generationTime;
+                String generationTimeStr = System.getProperty(SYSPROP_GENERATION_TIME);
+                if (generationTimeStr == null) {
+                    generationTime = new Date();
+                } else {
+                    try {
+                        generationTime = DateUtil.parseISO8601DateTime(generationTimeStr, DateUtil.UTC,
+                                new DateUtil.TrivialCalendarFieldsToDateConverter());
+                    } catch (DateParseException e) {
+                        throw new DocgenException(
+                                "Malformed \"" + SYSPROP_GENERATION_TIME
+                                + "\" system property value: " + generationTimeStr, e);
+                    }
+                }
+                fmConfig.setSharedVariable(VAR_TRANSFORM_START_TIME, generationTime);
+            }
             fmConfig.setSharedVariable(
                     VAR_INDEX_ENTRIES, indexEntries);
             int tofCntLv1 = countTOFEntries(tocNodes.get(0), 1);