summaryrefslogtreecommitdiff
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
parent49f942e13b1380c4df474f45d657e1a46bb6e2d8 (diff)
Try to fix time zone offsets in Windows.
-rw-r--r--src/metadata.cc33
-rw-r--r--src/metadata.h7
-rw-r--r--test/bias_to_string_test.cc30
-rw-r--r--test/tests.cc1
4 files changed, 70 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 ();
}
-
diff --git a/src/metadata.h b/src/metadata.h
index 7336766d..7ba17fa4 100644
--- a/src/metadata.h
+++ b/src/metadata.h
@@ -26,6 +26,8 @@
#include <string>
+class bias_to_string_test;
+
namespace libdcp
{
@@ -49,6 +51,11 @@ public:
std::string issuer;
std::string creator;
std::string issue_date;
+
+private:
+ friend class ::bias_to_string_test;
+
+ static std::string bias_to_string (int);
};
}
diff --git a/test/bias_to_string_test.cc b/test/bias_to_string_test.cc
new file mode 100644
index 00000000..56df40ea
--- /dev/null
+++ b/test/bias_to_string_test.cc
@@ -0,0 +1,30 @@
+/*
+ Copyright (C) 2013 Carl Hetherington <cth@carlh.net>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#include "metadata.h"
+
+/** Test XMLMetadata::bias_to_string */
+BOOST_AUTO_TEST_CASE (bias_to_string_test)
+{
+ BOOST_CHECK_EQUAL (libdcp::XMLMetadata::bias_to_string (30), "+0030");
+ BOOST_CHECK_EQUAL (libdcp::XMLMetadata::bias_to_string (60), "+0100");
+ BOOST_CHECK_EQUAL (libdcp::XMLMetadata::bias_to_string (61), "+0101");
+ BOOST_CHECK_EQUAL (libdcp::XMLMetadata::bias_to_string (7 * 60), "+0700");
+ BOOST_CHECK_EQUAL (libdcp::XMLMetadata::bias_to_string (-11 * 60), "-1100");
+}
diff --git a/test/tests.cc b/test/tests.cc
index 1057f789..11189558 100644
--- a/test/tests.cc
+++ b/test/tests.cc
@@ -70,6 +70,7 @@ wav (libdcp::Channel)
static string test_corpus = "../libdcp-test";
+#include "bias_to_string_test.cc"
#include "lut_test.cc"
#include "util_test.cc"
#include "decryption_test.cc"