summaryrefslogtreecommitdiff
blob: 30caaa92e9c5e1d39d4eb08fb34994636d34cc55 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# HG changeset patch
# Node ID e8f8e1558e11
# Parent  930e4fb71321
diff --git a/libpurple/tests/test_util.c b/libpurple/tests/test_util.c
--- a/libpurple/tests/test_util.c
+++ b/libpurple/tests/test_util.c
@@ -172,7 +172,7 @@
 	fail_unless(1282941722 == purple_str_to_time("2010-08-27.204202", TRUE, NULL, NULL, NULL));
 	fail_unless(1175919261 == purple_str_to_time("20070407T04:14:21.3234", TRUE, NULL, NULL, NULL));
 	fail_unless(1175919261 == purple_str_to_time("20070407T04:14:21Z", TRUE, NULL, NULL, NULL));
-	fail_unless(1631512800 == purple_str_to_time("09-13-2021", TRUE, NULL, NULL, NULL));
+	fail_unless(1631491200 == purple_str_to_time("09-13-2021", TRUE, NULL, NULL, NULL));
 
 	/* For testing local time we use Asia/Kathmandu because it's +05:45 and
 	 * doesn't have DST which means the test should always pass regardless of
@@ -195,9 +195,14 @@
 	 * localtime.
 	 */
 	timestamp = purple_str_to_time("09/13/202115:34:34", TRUE, NULL, NULL, &rest);
-	fail_unless(1631470500 == timestamp);
+	fail_unless(1631491200 == timestamp);
 	assert_string_equal("15:34:34", rest);
 
+	timestamp = purple_str_to_time("2010-08-27.134202-0700PDT", FALSE, &tm, &tz_off, &rest);
+	fail_unless(1282941722 == timestamp);
+	fail_unless((-7 * 60 * 60) == tz_off);
+	assert_string_equal("PDT", rest);
+
 	/* finally revert the TZ environment variable */
 	if(oldtz != NULL) {
 		g_setenv("TZ", oldtz, TRUE);
diff --git a/libpurple/util.c b/libpurple/util.c
--- a/libpurple/util.c
+++ b/libpurple/util.c
@@ -887,6 +887,17 @@
 				t.tm_isdst = -1; /* -1 means dst info is not available */
 			}
 		}
+	} else {
+		/* If we have a time, figure out if we need to adjust our tz offset. */
+		if(!mktime_with_utc) {
+			if(utc) {
+				mktime_with_utc = TRUE;
+				tzoff = 0;
+			} else {
+				/* Local Time */
+				t.tm_isdst = -1; /* -1 means dst info is not available */
+			}
+		}
 	}
 
 	g_free(hours);