summaryrefslogtreecommitdiff
path: root/src/metadata.cc
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2013-08-19 17:12:27 +0100
committerCarl Hetherington <cth@carlh.net>2013-08-19 17:12:27 +0100
commitdc35647c6383d0585ed6d9d3dfde32ef129d0d80 (patch)
tree529d3b9ab13ad2ed321092c904bdaa36add92f6e /src/metadata.cc
parent49f942e13b1380c4df474f45d657e1a46bb6e2d8 (diff)
Try to fix time zone offsets in Windows.
Diffstat (limited to 'src/metadata.cc')
-rw-r--r--src/metadata.cc33
1 files changed, 32 insertions, 1 deletions
diff --git a/src/metadata.cc b/src/metadata.cc
index fe883c94..3da7da12 100644
--- a/src/metadata.cc
+++ b/src/metadata.cc
@@ -21,6 +21,8 @@
* @brief Metadata for writing to the DCP.
*/
+#include <sstream>
+#include <iomanip>
#include <time.h>
#include "metadata.h"
@@ -50,7 +52,36 @@ XMLMetadata::set_issue_date_now ()
time_t now;
time (&now);
struct tm* tm = localtime (&now);
+#ifdef LIBDCP_POSIX
strftime (buffer, 64, "%Y-%m-%dT%I:%M:%S%z", tm);
issue_date = string (buffer);
+#else
+ /* No %z for strftime on Windows: it will seemingly be interpreted as %Z and will
+ output some localised string describing the timezone */
+ strftime (buffer, 64, "%Y-%m-%dT%I:%M:%S", tm);
+
+ TIME_ZONE_INFORMATION tz;
+ GetTimeZoneInformation (&tz);
+ issue_date = string (buffer) + bias_to_string (tz.Bias);
+#endif
+}
+
+string
+XMLMetadata::bias_to_string (int b)
+{
+ bool const negative = (b < 0);
+ b = negative ? -b : b;
+
+ int const hours = b / 60;
+ int const minutes = b % 60;
+
+ stringstream o;
+ if (negative) {
+ o << "-";
+ } else {
+ o << "+";
+ }
+
+ o << setw(2) << setfill('0') << hours << setw(2) << setfill('0') << minutes;
+ return o.str ();
}
-