diff --git a/docs/reference/glib/glib-sections.txt b/docs/reference/glib/glib-sections.txt index 68574040d8914c967560c9a03632ca04cbe08822..81a3e0c24523c35928b4275c28ef550fc9d4a1b5 100644 --- a/docs/reference/glib/glib-sections.txt +++ b/docs/reference/glib/glib-sections.txt @@ -1939,6 +1939,7 @@ g_time_zone_unref g_time_zone_ref g_time_zone_new +g_time_zone_new_identifier g_time_zone_new_local g_time_zone_new_utc g_time_zone_new_offset diff --git a/glib/gdatetime.c b/glib/gdatetime.c index 1755257befd46372288bcf18552c3109e5285b6f..c2180e44337c84bf6c6bcdb2c805af8bb49e3d7b 100644 --- a/glib/gdatetime.c +++ b/glib/gdatetime.c @@ -1383,15 +1383,15 @@ parse_iso8601_timezone (const gchar *text, gsize length, gssize *tz_offset) return NULL; *tz_offset = i; - tz = g_time_zone_new (text + i); + tz = g_time_zone_new_identifier (text + i); /* Double-check that the GTimeZone matches our interpretation of the timezone. * This can fail because our interpretation is less strict than (for example) * parse_time() in gtimezone.c, which restricts the range of the parsed * integers. */ - if (g_time_zone_get_offset (tz, 0) != offset_sign * (offset_hours * 3600 + offset_minutes * 60)) + if (tz == NULL || g_time_zone_get_offset (tz, 0) != offset_sign * (offset_hours * 3600 + offset_minutes * 60)) { - g_time_zone_unref (tz); + g_clear_pointer (&tz, g_time_zone_unref); return NULL; } diff --git a/glib/gtimezone.c b/glib/gtimezone.c index 96510138e9d96fb928f8258d40aecb260762029e..4b4324222b872ff6714ed78158f47a961fa50b9c 100644 --- a/glib/gtimezone.c +++ b/glib/gtimezone.c @@ -1604,7 +1604,39 @@ parse_footertz (const gchar *footer, size_t footerlen) * g_time_zone_new: * @identifier: (nullable): a timezone identifier * - * Creates a #GTimeZone corresponding to @identifier. + * A version of g_time_zone_new_identifier() which returns the UTC time zone + * if @identifier could not be parsed or loaded. + * + * If you need to check whether @identifier was loaded successfully, use + * g_time_zone_new_identifier(). + * + * Returns: (transfer full) (not nullable): the requested timezone + * Deprecated: 2.68: Use g_time_zone_new_identifier() instead, as it provides + * error reporting. Change your code to handle a potentially %NULL return + * value. + * + * Since: 2.26 + **/ +GTimeZone * +g_time_zone_new (const gchar *identifier) +{ + GTimeZone *tz = g_time_zone_new_identifier (identifier); + + /* Always fall back to UTC. */ + if (tz == NULL) + tz = g_time_zone_new_utc (); + + g_assert (tz != NULL); + + return g_steal_pointer (&tz); +} + +/** + * g_time_zone_new_identifier: + * @identifier: (nullable): a timezone identifier + * + * Creates a #GTimeZone corresponding to @identifier. If @identifier cannot be + * parsed or loaded, %NULL is returned. * * @identifier can either be an RFC3339/ISO 8601 time offset or * something that would pass as a valid value for the `TZ` environment @@ -1669,12 +1701,12 @@ parse_footertz (const gchar *footer, size_t footerlen) * You should release the return value by calling g_time_zone_unref() * when you are done with it. * - * Returns: the requested timezone - * - * Since: 2.26 - **/ + * Returns: (transfer full) (nullable): the requested timezone, or %NULL on + * failure + * Since: 2.68 + */ GTimeZone * -g_time_zone_new (const gchar *identifier) +g_time_zone_new_identifier (const gchar *identifier) { GTimeZone *tz = NULL; TimeZoneRule *rules; @@ -1788,24 +1820,31 @@ g_time_zone_new (const gchar *identifier) g_free (resolved_identifier); - /* Always fall back to UTC. */ + /* Failed to load the timezone. */ if (tz->t_info == NULL) - zone_for_constant_offset (tz, "UTC"); + { + g_slice_free (GTimeZone, tz); + + if (identifier) + G_UNLOCK (time_zones); + else + G_UNLOCK (tz_default); + + return NULL; + } g_assert (tz->name != NULL); g_assert (tz->t_info != NULL); - if (tz->t_info != NULL) + if (identifier) + g_hash_table_insert (time_zones, tz->name, tz); + else if (tz->name) { - if (identifier) - g_hash_table_insert (time_zones, tz->name, tz); - else if (tz->name) - { - /* Caching reference */ - g_atomic_int_inc (&tz->ref_count); - tz_default = tz; - } + /* Caching reference */ + g_atomic_int_inc (&tz->ref_count); + tz_default = tz; } + g_atomic_int_inc (&tz->ref_count); if (identifier) @@ -1839,7 +1878,8 @@ g_time_zone_new_utc (void) if (g_once_init_enter (&initialised)) { - utc = g_time_zone_new ("UTC"); + utc = g_time_zone_new_identifier ("UTC"); + g_assert (utc != NULL); g_once_init_leave (&initialised, TRUE); } @@ -1876,7 +1916,9 @@ g_time_zone_new_local (void) g_clear_pointer (&tz_local, g_time_zone_unref); if (tz_local == NULL) - tz_local = g_time_zone_new (tzenv); + tz_local = g_time_zone_new_identifier (tzenv); + if (tz_local == NULL) + tz_local = g_time_zone_new_utc (); tz = g_time_zone_ref (tz_local); @@ -1907,13 +1949,15 @@ g_time_zone_new_offset (gint32 seconds) /* Seemingly, we should be using @seconds directly to set the * #TransitionInfo.gmt_offset to avoid all this string building and parsing. * However, we always need to set the #GTimeZone.name to a constructed - * string anyway, so we might as well reuse its code. */ + * string anyway, so we might as well reuse its code. + * g_time_zone_new_identifier() should never fail in this situation. */ identifier = g_strdup_printf ("%c%02u:%02u:%02u", (seconds >= 0) ? '+' : '-', (ABS (seconds) / 60) / 60, (ABS (seconds) / 60) % 60, ABS (seconds) % 60); - tz = g_time_zone_new (identifier); + tz = g_time_zone_new_identifier (identifier); + g_assert (tz != NULL); g_free (identifier); g_assert (g_time_zone_get_offset (tz, 0) == seconds); diff --git a/glib/gtimezone.h b/glib/gtimezone.h index 4e8b10a7158d32e86faf531051b6891a93ee4af8..d68a76d3e941cb0cb5d84b8a744a1795324b9649 100644 --- a/glib/gtimezone.h +++ b/glib/gtimezone.h @@ -24,6 +24,7 @@ #error "Only can be included directly." #endif +#include #include G_BEGIN_DECLS @@ -52,8 +53,10 @@ typedef enum G_TIME_TYPE_UNIVERSAL } GTimeType; -GLIB_AVAILABLE_IN_ALL +GLIB_DEPRECATED_IN_2_68_FOR (g_time_zone_new_identifier) GTimeZone * g_time_zone_new (const gchar *identifier); +GLIB_AVAILABLE_IN_2_68 +GTimeZone * g_time_zone_new_identifier (const gchar *identifier); GLIB_AVAILABLE_IN_ALL GTimeZone * g_time_zone_new_utc (void); GLIB_AVAILABLE_IN_ALL diff --git a/glib/tests/autoptr.c b/glib/tests/autoptr.c index cd510ed16511ed1e3172d982dabaca40d4a4aa8d..59471d02f4014b556e6ebb3dd652b35d7b58b1a5 100644 --- a/glib/tests/autoptr.c +++ b/glib/tests/autoptr.c @@ -537,7 +537,7 @@ test_g_timer (void) static void test_g_time_zone (void) { - g_autoptr(GTimeZone) val = g_time_zone_new ("UTC"); + g_autoptr(GTimeZone) val = g_time_zone_new_utc (); g_assert_nonnull (val); } diff --git a/glib/tests/gdatetime.c b/glib/tests/gdatetime.c index 4ea0fc6f473074d94e8a10e47c15d34fd04b5029..132f7304ceb1ba4d7d4bd448f9009160d59e070a 100644 --- a/glib/tests/gdatetime.c +++ b/glib/tests/gdatetime.c @@ -234,7 +234,8 @@ test_GDateTime_equal (void) g_date_time_unref (dt2); /* UTC-0300 and not in DST */ - tz = g_time_zone_new ("-03:00"); + tz = g_time_zone_new_identifier ("-03:00"); + g_assert_nonnull (tz); dt1 = g_date_time_new (tz, 2010, 5, 24, 8, 0, 0); g_time_zone_unref (tz); g_assert_cmpint (g_date_time_get_utc_offset (dt1) / G_USEC_PER_SEC, ==, (-3 * 3600)); @@ -247,10 +248,11 @@ test_GDateTime_equal (void) /* America/Recife is in UTC-0300 */ #ifdef G_OS_UNIX - tz = g_time_zone_new ("America/Recife"); + tz = g_time_zone_new_identifier ("America/Recife"); #elif defined G_OS_WIN32 - tz = g_time_zone_new ("E. South America Standard Time"); + tz = g_time_zone_new_identifier ("E. South America Standard Time"); #endif + g_assert_nonnull (tz); dt1 = g_date_time_new (tz, 2010, 5, 24, 8, 0, 0); g_time_zone_unref (tz); g_assert_cmpint (g_date_time_get_utc_offset (dt1) / G_USEC_PER_SEC, ==, (-3 * 3600)); @@ -1174,10 +1176,11 @@ test_GDateTime_new_full (void) g_date_time_unref (dt); #ifdef G_OS_UNIX - tz = g_time_zone_new ("America/Tijuana"); + tz = g_time_zone_new_identifier ("America/Tijuana"); #elif defined G_OS_WIN32 - tz = g_time_zone_new ("Pacific Standard Time"); + tz = g_time_zone_new_identifier ("Pacific Standard Time"); #endif + g_assert_nonnull (tz); dt = g_date_time_new (tz, 2010, 11, 24, 8, 4, 0); dt_tz = g_date_time_get_timezone (dt); @@ -1938,10 +1941,11 @@ test_GDateTime_dst (void) /* this date has the DST state set for Europe/London */ #ifdef G_OS_UNIX - tz = g_time_zone_new ("Europe/London"); + tz = g_time_zone_new_identifier ("Europe/London"); #elif defined G_OS_WIN32 - tz = g_time_zone_new ("GMT Standard Time"); + tz = g_time_zone_new_identifier ("GMT Standard Time"); #endif + g_assert_nonnull (tz); dt1 = g_date_time_new (tz, 2009, 8, 15, 3, 0, 1); g_assert (g_date_time_is_daylight_savings (dt1)); g_assert_cmpint (g_date_time_get_utc_offset (dt1) / G_USEC_PER_SEC, ==, 3600); @@ -2123,7 +2127,8 @@ test_z (void) g_test_bug ("http://bugzilla.gnome.org/642935"); - tz = g_time_zone_new ("-08:00"); + tz = g_time_zone_new_identifier ("-08:00"); + g_assert_nonnull (tz); dt = g_date_time_new (tz, 1, 1, 1, 0, 0, 0); p = g_date_time_format (dt, "%z"); @@ -2145,7 +2150,8 @@ test_z (void) g_date_time_unref (dt); g_time_zone_unref (tz); - tz = g_time_zone_new ("+00:00"); + tz = g_time_zone_new_identifier ("+00:00"); + g_assert_nonnull (tz); dt = g_date_time_new (tz, 1, 1, 1, 0, 0, 0); p = g_date_time_format (dt, "%:::z"); g_assert_cmpstr (p, ==, "+00"); @@ -2153,7 +2159,8 @@ test_z (void) g_date_time_unref (dt); g_time_zone_unref (tz); - tz = g_time_zone_new ("+08:23"); + tz = g_time_zone_new_identifier ("+08:23"); + g_assert_nonnull (tz); dt = g_date_time_new (tz, 1, 1, 1, 0, 0, 0); p = g_date_time_format (dt, "%:::z"); g_assert_cmpstr (p, ==, "+08:23"); @@ -2161,7 +2168,8 @@ test_z (void) g_date_time_unref (dt); g_time_zone_unref (tz); - tz = g_time_zone_new ("+08:23:45"); + tz = g_time_zone_new_identifier ("+08:23:45"); + g_assert_nonnull (tz); dt = g_date_time_new (tz, 1, 1, 1, 0, 0, 0); p = g_date_time_format (dt, "%:::z"); g_assert_cmpstr (p, ==, "+08:23:45"); @@ -2169,7 +2177,8 @@ test_z (void) g_date_time_unref (dt); g_time_zone_unref (tz); - tz = g_time_zone_new ("-00:15"); + tz = g_time_zone_new_identifier ("-00:15"); + g_assert_nonnull (tz); dt = g_date_time_new (tz, 1, 1, 1, 0, 0, 0); p = g_date_time_format (dt, "%z"); @@ -2214,10 +2223,11 @@ test_6_days_until_end_of_the_month (void) * - https://tools.ietf.org/id/draft-murchison-tzdist-tzif-15.html#rfc.section.3.3 * - https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html#tag_08_03 */ - tz = g_time_zone_new ("CET-1CEST,M3.5.0,M10.5.0/3"); + tz = g_time_zone_new_identifier ("CET-1CEST,M3.5.0,M10.5.0/3"); #elif defined (G_OS_WIN32) - tz = g_time_zone_new ("Romance Standard Time"); + tz = g_time_zone_new_identifier ("Romance Standard Time"); #endif + g_assert_nonnull (tz); dt = g_date_time_new (tz, 2020, 10, 5, 1, 1, 1); p = g_date_time_format (dt, "%Y-%m-%d %H:%M:%S%z"); @@ -2320,10 +2330,11 @@ test_find_interval (void) gint i1, i2; #ifdef G_OS_UNIX - tz = g_time_zone_new ("America/Toronto"); + tz = g_time_zone_new_identifier ("America/Toronto"); #elif defined G_OS_WIN32 - tz = g_time_zone_new ("Eastern Standard Time"); + tz = g_time_zone_new_identifier ("Eastern Standard Time"); #endif + g_assert_nonnull (tz); dt = g_date_time_new_utc (2010, 11, 7, 1, 30, 0); u = g_date_time_to_unix (dt); @@ -2353,10 +2364,11 @@ test_adjust_time (void) gint i1, i2; #ifdef G_OS_UNIX - tz = g_time_zone_new ("America/Toronto"); + tz = g_time_zone_new_identifier ("America/Toronto"); #elif defined G_OS_WIN32 - tz = g_time_zone_new ("Eastern Standard Time"); + tz = g_time_zone_new_identifier ("Eastern Standard Time"); #endif + g_assert_nonnull (tz); dt = g_date_time_new_utc (2010, 11, 7, 1, 30, 0); u = g_date_time_to_unix (dt); u2 = u; @@ -2388,7 +2400,9 @@ test_no_header (void) { GTimeZone *tz; + G_GNUC_BEGIN_IGNORE_DEPRECATIONS tz = g_time_zone_new ("blabla"); + G_GNUC_END_IGNORE_DEPRECATIONS g_assert_cmpstr (g_time_zone_get_identifier (tz), ==, "UTC"); g_assert_cmpstr (g_time_zone_get_abbreviation (tz, 0), ==, "UTC"); @@ -2398,6 +2412,16 @@ test_no_header (void) g_time_zone_unref (tz); } +static void +test_no_header_identifier (void) +{ + GTimeZone *tz; + + tz = g_time_zone_new_identifier ("blabla"); + + g_assert_null (tz); +} + static void test_posix_parse (void) { @@ -2405,7 +2429,9 @@ test_posix_parse (void) GDateTime *gdt1, *gdt2; /* Check that an unknown zone name falls back to UTC. */ + G_GNUC_BEGIN_IGNORE_DEPRECATIONS tz = g_time_zone_new ("nonexistent"); + G_GNUC_END_IGNORE_DEPRECATIONS g_assert_cmpstr (g_time_zone_get_identifier (tz), ==, "UTC"); g_assert_cmpstr (g_time_zone_get_abbreviation (tz, 0), ==, "UTC"); g_assert_cmpint (g_time_zone_get_offset (tz, 0), ==, 0); @@ -2413,7 +2439,9 @@ test_posix_parse (void) g_time_zone_unref (tz); /* An existent zone name should not fall back to UTC. */ + G_GNUC_BEGIN_IGNORE_DEPRECATIONS tz = g_time_zone_new ("PST8"); + G_GNUC_END_IGNORE_DEPRECATIONS g_assert_cmpstr (g_time_zone_get_identifier (tz), ==, "PST8"); g_assert_cmpstr (g_time_zone_get_abbreviation (tz, 0), ==, "PST"); g_assert_cmpint (g_time_zone_get_offset (tz, 0), ==, - 8 * 3600); @@ -2423,7 +2451,8 @@ test_posix_parse (void) /* This fails rules_from_identifier on Unix (though not on Windows) * but passes anyway because PST8PDT is a zone name. */ - tz = g_time_zone_new ("PST8PDT"); + tz = g_time_zone_new_identifier ("PST8PDT"); + g_assert_nonnull (tz); g_assert_cmpstr (g_time_zone_get_identifier (tz), ==, "PST8PDT"); g_assert_cmpstr (g_time_zone_get_abbreviation (tz, 0), ==, "PST"); g_assert_cmpint (g_time_zone_get_offset (tz, 0), ==, - 8 * 3600); @@ -2433,8 +2462,9 @@ test_posix_parse (void) g_assert (g_time_zone_is_dst (tz, 1)); g_time_zone_unref (tz); - tz = g_time_zone_new ("PST8PDT6:32:15"); + tz = g_time_zone_new_identifier ("PST8PDT6:32:15"); #ifdef G_OS_WIN32 + g_assert_nonnull (tz); g_assert_cmpstr (g_time_zone_get_identifier (tz), ==, "PST8PDT6:32:15"); g_assert_cmpstr (g_time_zone_get_abbreviation (tz, 0), ==, "PST"); g_assert_cmpint (g_time_zone_get_offset (tz, 0), ==, - 8 * 3600); @@ -2451,14 +2481,12 @@ test_posix_parse (void) g_date_time_unref (gdt1); g_date_time_unref (gdt2); #else - g_assert_cmpstr (g_time_zone_get_identifier (tz), ==, "UTC"); - g_assert_cmpstr (g_time_zone_get_abbreviation (tz, 0), ==, "UTC"); - g_assert_cmpint (g_time_zone_get_offset (tz, 0), ==, 0); - g_assert (!g_time_zone_is_dst (tz, 0)); + g_assert_null (tz); #endif - g_time_zone_unref (tz); + g_clear_pointer (&tz, g_time_zone_unref); - tz = g_time_zone_new ("NZST-12:00:00NZDT-13:00:00,M10.1.0,M3.3.0"); + tz = g_time_zone_new_identifier ("NZST-12:00:00NZDT-13:00:00,M10.1.0,M3.3.0"); + g_assert_nonnull (tz); g_assert_cmpstr (g_time_zone_get_identifier (tz), ==, "NZST-12:00:00NZDT-13:00:00,M10.1.0,M3.3.0"); g_assert_cmpstr (g_time_zone_get_abbreviation (tz, 0), ==, "NZST"); g_assert_cmpint (g_time_zone_get_offset (tz, 0), ==, 12 * 3600); @@ -2484,7 +2512,8 @@ test_posix_parse (void) g_date_time_unref (gdt2); g_time_zone_unref (tz); - tz = g_time_zone_new ("NZST-12:00:00NZDT-13:00:00,279,76"); + tz = g_time_zone_new_identifier ("NZST-12:00:00NZDT-13:00:00,279,76"); + g_assert_nonnull (tz); g_assert_cmpstr (g_time_zone_get_identifier (tz), ==, "NZST-12:00:00NZDT-13:00:00,279,76"); g_assert_cmpstr (g_time_zone_get_abbreviation (tz, 0), ==, "NZST"); g_assert_cmpint (g_time_zone_get_offset (tz, 0), ==, 12 * 3600); @@ -2510,7 +2539,8 @@ test_posix_parse (void) g_date_time_unref (gdt2); g_time_zone_unref (tz); - tz = g_time_zone_new ("NZST-12:00:00NZDT-13:00:00,J279,J76"); + tz = g_time_zone_new_identifier ("NZST-12:00:00NZDT-13:00:00,J279,J76"); + g_assert_nonnull (tz); g_assert_cmpstr (g_time_zone_get_identifier (tz), ==, "NZST-12:00:00NZDT-13:00:00,J279,J76"); g_assert_cmpstr (g_time_zone_get_abbreviation (tz, 0), ==, "NZST"); g_assert_cmpint (g_time_zone_get_offset (tz, 0), ==, 12 * 3600); @@ -2536,7 +2566,8 @@ test_posix_parse (void) g_date_time_unref (gdt2); g_time_zone_unref (tz); - tz = g_time_zone_new ("NZST-12:00:00NZDT-13:00:00,M10.1.0/07:00,M3.3.0/07:00"); + tz = g_time_zone_new_identifier ("NZST-12:00:00NZDT-13:00:00,M10.1.0/07:00,M3.3.0/07:00"); + g_assert_nonnull (tz); g_assert_cmpstr (g_time_zone_get_identifier (tz), ==, "NZST-12:00:00NZDT-13:00:00,M10.1.0/07:00,M3.3.0/07:00"); g_assert_cmpstr (g_time_zone_get_abbreviation (tz, 0), ==, "NZST"); g_assert_cmpint (g_time_zone_get_offset (tz, 0), ==, 12 * 3600); @@ -2586,13 +2617,15 @@ test_posix_parse (void) g_date_time_unref (gdt2); g_time_zone_unref (tz); - tz = g_time_zone_new ("VIR-00:30"); + tz = g_time_zone_new_identifier ("VIR-00:30"); + g_assert_nonnull (tz); g_assert_cmpstr (g_time_zone_get_identifier (tz), ==, "VIR-00:30"); g_assert_cmpstr (g_time_zone_get_abbreviation (tz, 0), ==, "VIR"); g_assert_cmpint (g_time_zone_get_offset (tz, 0), ==, (30 * 60)); g_assert_false (g_time_zone_is_dst (tz, 0)); - tz = g_time_zone_new ("VIR-00:30VID,0/00:00:00,365/23:59:59"); + tz = g_time_zone_new_identifier ("VIR-00:30VID,0/00:00:00,365/23:59:59"); + g_assert_nonnull (tz); g_assert_cmpstr (g_time_zone_get_identifier (tz), ==, "VIR-00:30VID,0/00:00:00,365/23:59:59"); g_assert_cmpstr (g_time_zone_get_abbreviation (tz, 0), ==, "VIR"); g_assert_cmpint (g_time_zone_get_offset (tz, 0), ==, (30 * 60)); @@ -2601,7 +2634,8 @@ test_posix_parse (void) g_assert_cmpint (g_time_zone_get_offset (tz, 1), ==, (90 * 60)); g_assert_true (g_time_zone_is_dst (tz, 1)); - tz = g_time_zone_new ("VIR-02:30VID,0/00:00:00,365/23:59:59"); + tz = g_time_zone_new_identifier ("VIR-02:30VID,0/00:00:00,365/23:59:59"); + g_assert_nonnull (tz); g_assert_cmpstr (g_time_zone_get_identifier (tz), ==, "VIR-02:30VID,0/00:00:00,365/23:59:59"); g_assert_cmpstr (g_time_zone_get_abbreviation (tz, 0), ==, "VIR"); g_assert_cmpint (g_time_zone_get_offset (tz, 0), ==, (150 * 60)); @@ -2610,7 +2644,8 @@ test_posix_parse (void) g_assert_cmpint (g_time_zone_get_offset (tz, 1), ==, (210 * 60)); g_assert_true (g_time_zone_is_dst (tz, 1)); - tz = g_time_zone_new ("VIR-02:30VID-04:30,0/00:00:00,365/23:59:59"); + tz = g_time_zone_new_identifier ("VIR-02:30VID-04:30,0/00:00:00,365/23:59:59"); + g_assert_nonnull (tz); g_assert_cmpstr (g_time_zone_get_identifier (tz), ==, "VIR-02:30VID-04:30,0/00:00:00,365/23:59:59"); g_assert_cmpstr (g_time_zone_get_abbreviation (tz, 0), ==, "VIR"); g_assert_cmpint (g_time_zone_get_offset (tz, 0), ==, (150 * 60)); @@ -2619,7 +2654,8 @@ test_posix_parse (void) g_assert_cmpint (g_time_zone_get_offset (tz, 1), ==, (270 * 60)); g_assert_true (g_time_zone_is_dst (tz, 1)); - tz = g_time_zone_new ("VIR-12:00VID-13:00,0/00:00:00,365/23:59:59"); + tz = g_time_zone_new_identifier ("VIR-12:00VID-13:00,0/00:00:00,365/23:59:59"); + g_assert_nonnull (tz); g_assert_cmpstr (g_time_zone_get_identifier (tz), ==, "VIR-12:00VID-13:00,0/00:00:00,365/23:59:59"); g_assert_cmpstr (g_time_zone_get_abbreviation (tz, 0), ==, "VIR"); g_assert_cmpint (g_time_zone_get_offset (tz, 0), ==, (720 * 60)); @@ -2637,7 +2673,8 @@ test_GDateTime_floating_point (void) g_test_bug ("http://bugzilla.gnome.org/697715"); - tz = g_time_zone_new ("-03:00"); + tz = g_time_zone_new_identifier ("-03:00"); + g_assert_nonnull (tz); g_assert_cmpstr (g_time_zone_get_identifier (tz), ==, "-03:00"); dt = g_date_time_new (tz, 2010, 5, 24, 8, 0, 1.000001); g_time_zone_unref (tz); @@ -2659,7 +2696,8 @@ test_identifier (void) const char *recife_tz = "America/Recife"; #endif - tz = g_time_zone_new ("UTC"); + tz = g_time_zone_new_identifier ("UTC"); + g_assert_nonnull (tz); g_assert_cmpstr (g_time_zone_get_identifier (tz), ==, "UTC"); g_time_zone_unref (tz); @@ -2667,21 +2705,27 @@ test_identifier (void) g_assert_cmpstr (g_time_zone_get_identifier (tz), ==, "UTC"); g_time_zone_unref (tz); + G_GNUC_BEGIN_IGNORE_DEPRECATIONS tz = g_time_zone_new ("some rubbish"); + G_GNUC_END_IGNORE_DEPRECATIONS g_assert_cmpstr (g_time_zone_get_identifier (tz), ==, "UTC"); g_time_zone_unref (tz); - tz = g_time_zone_new ("Z"); + tz = g_time_zone_new_identifier ("Z"); + g_assert_nonnull (tz); g_assert_cmpstr (g_time_zone_get_identifier (tz), ==, "Z"); g_time_zone_unref (tz); - tz = g_time_zone_new ("+03:15"); + tz = g_time_zone_new_identifier ("+03:15"); + g_assert_nonnull (tz); g_assert_cmpstr (g_time_zone_get_identifier (tz), ==, "+03:15"); g_time_zone_unref (tz); /* System timezone. We can’t change this, but we can at least assert that * the identifier is non-NULL and non-empty. */ + G_GNUC_BEGIN_IGNORE_DEPRECATIONS tz = g_time_zone_new (NULL); + G_GNUC_END_IGNORE_DEPRECATIONS g_test_message ("System time zone identifier: %s", g_time_zone_get_identifier (tz)); g_assert_nonnull (g_time_zone_get_identifier (tz)); g_assert_cmpstr (g_time_zone_get_identifier (tz), !=, ""); @@ -2767,10 +2811,8 @@ test_time_zone_parse_rfc8536 (void) path = g_test_build_filename (G_TEST_DIST, "time-zones", test_files[i], NULL); g_assert_true (g_path_is_absolute (path)); - tz = g_time_zone_new (path); + tz = g_time_zone_new_identifier (path); g_assert_nonnull (tz); - /* UTC will be loaded as a fallback if parsing fails */ - g_assert_cmpstr (g_time_zone_get_identifier (tz), !=, "UTC"); g_time_zone_unref (tz); g_free (path); } @@ -2787,13 +2829,17 @@ test_time_zone_caching (void) /* Check a specific (arbitrary) timezone. These are only cached while third * party code holds a ref to at least one instance. */ #ifdef G_OS_UNIX - tz1 = g_time_zone_new ("Europe/London"); - tz2 = g_time_zone_new ("Europe/London"); + tz1 = g_time_zone_new_identifier ("Europe/London"); + g_assert_nonnull (tz1); + tz2 = g_time_zone_new_identifier ("Europe/London"); + g_assert_nonnull (tz2); g_time_zone_unref (tz1); g_time_zone_unref (tz2); #elif defined G_OS_WIN32 - tz1 = g_time_zone_new ("GMT Standard Time"); - tz2 = g_time_zone_new ("GMT Standard Time"); + tz1 = g_time_zone_new_identifier ("GMT Standard Time"); + g_assert_nonnull (tz1); + tz2 = g_time_zone_new_identifier ("GMT Standard Time"); + g_assert_nonnull (tz2); g_time_zone_unref (tz1); g_time_zone_unref (tz2); #endif @@ -2804,9 +2850,11 @@ test_time_zone_caching (void) /* Check the default timezone, local and UTC. These are cached internally in * GLib, so should persist even after the last third party reference is * dropped. */ - tz1 = g_time_zone_new (NULL); + tz1 = g_time_zone_new_identifier (NULL); + g_assert_nonnull (tz1); g_time_zone_unref (tz1); - tz2 = g_time_zone_new (NULL); + tz2 = g_time_zone_new_identifier (NULL); + g_assert_nonnull (tz2); g_time_zone_unref (tz2); g_assert_true (tz1 == tz2); @@ -2893,6 +2941,7 @@ main (gint argc, g_test_add_func ("/GTimeZone/find-interval", test_find_interval); g_test_add_func ("/GTimeZone/adjust-time", test_adjust_time); g_test_add_func ("/GTimeZone/no-header", test_no_header); + g_test_add_func ("/GTimeZone/no-header-identifier", test_no_header_identifier); g_test_add_func ("/GTimeZone/posix-parse", test_posix_parse); g_test_add_func ("/GTimeZone/floating-point", test_GDateTime_floating_point); g_test_add_func ("/GTimeZone/identifier", test_identifier);