MINOR: samples: add two converters for the date format

This patch adds two converters :

   ltime(<format>[,<offset>])
   utime(<format>[,<offset>])

Both use strftime() to emit the output string from an input date. ltime()
provides local time, while utime() provides the UTC time.
diff --git a/doc/configuration.txt b/doc/configuration.txt
index 8a7a402..96da1cc 100644
--- a/doc/configuration.txt
+++ b/doc/configuration.txt
@@ -10017,6 +10017,20 @@
   sample fetch function or after a transformation keyword returning a string
   type. The result is of type string.
 
+ltime(<format>[,<offset>])
+  Converts an integer supposed to contain a date since epoch to a string
+  representing this date in local time using a format defined by the <format>
+  string using strftime(3). The purpose is to allow any date format to be used
+  in logs. An optional <offset> in seconds may be applied to the input date
+  (positive or negative). See the strftime() man page for the format supported
+  by your operating system. See also the utime converter.
+
+  Example :
+
+      # Emit two colons, one with the local time and another with ip:port
+      # Eg:  20140710162350 127.0.0.1:57325
+      log-format %[date,ltime(%Y%m%d%H%M%S)]\ %ci:%cp
+
 map(<map_file>[,<default_value>])
 map_<match_type>(<map_file>[,<default_value>])
 map_<match_type>_<output_type>(<map_file>[,<default_value>])
@@ -10218,6 +10232,20 @@
   sample fetch function or after a transformation keyword returning a string
   type. The result is of type string.
 
+utime(<format>[,<offset>])
+  Converts an integer supposed to contain a date since epoch to a string
+  representing this date in UTC time using a format defined by the <format>
+  string using strftime(3). The purpose is to allow any date format to be used
+  in logs. An optional <offset> in seconds may be applied to the input date
+  (positive or negative). See the strftime() man page for the format supported
+  by your operating system. See also the ltime converter.
+
+  Example :
+
+      # Emit two colons, one with the UTC time and another with ip:port
+      # Eg:  20140710162350 127.0.0.1:57325
+      log-format %[date,utime(%Y%m%d%H%M%S)]\ %ci:%cp
+
 
 7.3.2. Fetching samples from internal states
 --------------------------------------------
diff --git a/src/sample.c b/src/sample.c
index 3a0f3fb..c260f7e 100644
--- a/src/sample.c
+++ b/src/sample.c
@@ -1261,6 +1261,46 @@
 	return 1;
 }
 
+/* takes an UINT value on input supposed to represent the time since EPOCH,
+ * adds an optional offset found in args[1] and emits a string representing
+ * the local time in the format specified in args[1] using strftime().
+ */
+static int sample_conv_ltime(const struct arg *args, struct sample *smp)
+{
+	struct chunk *temp;
+	time_t curr_date = smp->data.uint;
+
+	/* add offset */
+	if (args[1].type == ARGT_SINT || args[1].type == ARGT_UINT)
+		curr_date += args[1].data.sint;
+
+	temp = get_trash_chunk();
+	temp->len = strftime(temp->str, temp->size, args[0].data.str.str, localtime(&curr_date));
+	smp->data.str = *temp;
+	smp->type = SMP_T_STR;
+	return 1;
+}
+
+/* takes an UINT value on input supposed to represent the time since EPOCH,
+ * adds an optional offset found in args[1] and emits a string representing
+ * the UTC date in the format specified in args[1] using strftime().
+ */
+static int sample_conv_utime(const struct arg *args, struct sample *smp)
+{
+	struct chunk *temp;
+	time_t curr_date = smp->data.uint;
+
+	/* add offset */
+	if (args[1].type == ARGT_SINT || args[1].type == ARGT_UINT)
+		curr_date += args[1].data.sint;
+
+	temp = get_trash_chunk();
+	temp->len = strftime(temp->str, temp->size, args[0].data.str.str, gmtime(&curr_date));
+	smp->data.str = *temp;
+	smp->type = SMP_T_STR;
+	return 1;
+}
+
 /************************************************************************/
 /*       All supported sample fetch functions must be declared here     */
 /************************************************************************/
@@ -1363,6 +1403,8 @@
 	{ "lower",  sample_conv_str2lower, 0,            NULL, SMP_T_STR,  SMP_T_STR  },
 	{ "hex",    sample_conv_bin2hex,   0,            NULL, SMP_T_BIN,  SMP_T_STR  },
 	{ "ipmask", sample_conv_ipmask,    ARG1(1,MSK4), NULL, SMP_T_IPV4, SMP_T_IPV4 },
+	{ "ltime",  sample_conv_ltime,     ARG2(1,STR,SINT), NULL, SMP_T_UINT, SMP_T_STR },
+	{ "utime",  sample_conv_utime,     ARG2(1,STR,SINT), NULL, SMP_T_UINT, SMP_T_STR },
 	{ NULL, NULL, 0, 0, 0 },
 }};