diff --git a/gst/gstvalue.c b/gst/gstvalue.c index 2f0986a00b..883356a751 100644 --- a/gst/gstvalue.c +++ b/gst/gstvalue.c @@ -4375,21 +4375,24 @@ gst_value_compare_date_time (const GValue * value1, const GValue * value2) static gchar * gst_value_serialize_date_time (const GValue * val) { - const GstDateTime *date = (const GstDateTime *) g_value_get_boxed (val); + GstDateTime *date = (GstDateTime *) g_value_get_boxed (val); gint offset; + gint tzhour, tzminute; if (date == NULL) return g_strdup ("null"); offset = gst_date_time_get_time_zone_offset (date); + tzhour = (gint) ABS (offset); + tzminute = (gint) ((ABS (offset) - tzhour) * 60); + return g_strdup_printf ("\"%04d-%02d-%02dT%02d:%02d:%02d.%06d" "%c%02d%02d\"", gst_date_time_get_year (date), gst_date_time_get_month (date), gst_date_time_get_day (date), gst_date_time_get_hour (date), gst_date_time_get_minute (date), gst_date_time_get_second (date), gst_date_time_get_microsecond (date), - offset >= 0 ? '+' : '-', (gint) ABS (offset) / 60, - (gint) ABS (offset) % 60); + offset >= 0 ? '+' : '-', tzhour, tzminute); } static gboolean @@ -4398,6 +4401,7 @@ gst_value_deserialize_date_time (GValue * dest, const gchar * s) gint year, month, day, hour, minute, second, usecond; gchar signal; gint offset = 0; + gfloat tzoffset = 0; gint ret; if (!s || strcmp (s, "null") == 0) { @@ -4407,14 +4411,14 @@ gst_value_deserialize_date_time (GValue * dest, const gchar * s) ret = sscanf (s, "%04d-%02d-%02dT%02d:%02d:%02d.%06d%c%04d", &year, &month, &day, &hour, &minute, &second, &usecond, &signal, &offset); if (ret >= 9) { - offset = (offset / 100) * 60 + (offset % 100); + tzoffset = (offset / 100) + ((offset % 100) / 60.0); if (signal == '-') - offset = -offset; + tzoffset = -tzoffset; } else return FALSE; g_value_take_boxed (dest, gst_date_time_new (year, month, day, hour, - minute, second, usecond, offset)); + minute, second, usecond, tzoffset)); return TRUE; } diff --git a/tests/check/gst/gstvalue.c b/tests/check/gst/gstvalue.c index c53cfa827b..ae0d1169da 100644 --- a/tests/check/gst/gstvalue.c +++ b/tests/check/gst/gstvalue.c @@ -2066,7 +2066,7 @@ GST_START_TEST (test_date_time) str = NULL; /* with timezone */ - datetime = gst_date_time_new (2010, 6, 23, 7, 40, 10, 1, -3 * 60); + datetime = gst_date_time_new (2010, 6, 23, 7, 40, 10, 1, -3.0); s = gst_structure_new ("media/x-type", "SOME_DATE_TIME_TAG", GST_TYPE_DATE_TIME, datetime, NULL); @@ -2108,8 +2108,7 @@ GST_START_TEST (test_date_time) fail_unless (gst_date_time_get_minute (datetime) == 40); fail_unless (gst_date_time_get_second (datetime) == 10); fail_unless (gst_date_time_get_microsecond (datetime) == 1); - fail_unless (gst_date_time_get_time_zone_offset (datetime) == - ((gint64) - 3 * 60)); + fail_unless (gst_date_time_get_time_zone_offset (datetime) == -3); gst_date_time_unref (datetime); datetime = NULL; @@ -2123,7 +2122,7 @@ GST_START_TEST (test_date_time) str = NULL; /* with positive timezone */ - datetime = gst_date_time_new (2010, 6, 23, 7, 40, 10, 1, 2 * 60); + datetime = gst_date_time_new (2010, 6, 23, 7, 40, 10, 1, 2); s = gst_structure_new ("media/x-type", "SOME_DATE_TIME_TAG", GST_TYPE_DATE_TIME, datetime, NULL); @@ -2165,8 +2164,7 @@ GST_START_TEST (test_date_time) fail_unless (gst_date_time_get_minute (datetime) == 40); fail_unless (gst_date_time_get_second (datetime) == 10); fail_unless (gst_date_time_get_microsecond (datetime) == 1); - fail_unless (gst_date_time_get_time_zone_offset (datetime) == - ((gint64) 2 * 60)); + fail_unless (gst_date_time_get_time_zone_offset (datetime) == 2); gst_date_time_unref (datetime); datetime = NULL;