diff options
-rw-r--r-- | gtk/gtkfilechooserdefault.c | 103 |
1 files changed, 15 insertions, 88 deletions
diff --git a/gtk/gtkfilechooserdefault.c b/gtk/gtkfilechooserdefault.c index f3ce7aa463..e21a833ae8 100644 --- a/gtk/gtkfilechooserdefault.c +++ b/gtk/gtkfilechooserdefault.c @@ -3909,103 +3909,30 @@ stop_loading_and_clear_list_model (GtkFileChooserDefault *impl, static char * my_g_format_time_for_display (glong secs) { - GDate mtime, now; - gint days_diff; - struct tm tm_mtime; - time_t time_mtime, time_now; + GDateTime *now, *time; + GTimeSpan time_diff; const gchar *format; - gchar *locale_format = NULL; - gchar buf[256]; - char *date_str = NULL; -#ifdef G_OS_WIN32 - const char *locale, *dot = NULL; - gint64 codepage = -1; - char charset[20]; -#endif + gchar *date_str; - time_mtime = secs; - -#ifdef HAVE_LOCALTIME_R - localtime_r ((time_t *) &time_mtime, &tm_mtime); -#else - { - struct tm *ptm = localtime ((time_t *) &time_mtime); + now = g_date_time_new_now_local (); + time = g_date_time_new_from_unix_local (secs); + time_diff = g_date_time_difference (now, time); - if (!ptm) - { - g_warning ("ptm != NULL failed"); - - return g_strdup (_("Unknown")); - } - else - memcpy ((void *) &tm_mtime, (void *) ptm, sizeof (struct tm)); - } -#endif /* HAVE_LOCALTIME_R */ - - g_date_set_time_t (&mtime, time_mtime); - time_now = time (NULL); - g_date_set_time_t (&now, time_now); - - days_diff = g_date_get_julian (&now) - g_date_get_julian (&mtime); - - /* Translators: %H means "hours" and %M means "minutes" */ - if (days_diff == 0) + /* Translators: see g_date_time_format() for details on the format */ + if (time_diff >= 0 && time_diff < G_TIME_SPAN_DAY) format = _("%H:%M"); - else if (days_diff == 1) + else if (time_diff >= 0 && time_diff < 2 * G_TIME_SPAN_DAY) format = _("Yesterday at %H:%M"); + else if (time_diff >= 0 && time_diff < 7 * G_TIME_SPAN_DAY) + format = "%A"; /* Days from last week */ else - { - if (days_diff > 1 && days_diff < 7) - format = "%A"; /* Days from last week */ - else - format = "%x"; /* Any other date */ - } + format = "%x"; /* Any other date */ -#ifdef G_OS_WIN32 - /* g_locale_from_utf8() returns a string in the system - * code-page, which is not always the same as that used by the C - * library. For instance when running a GTK+ program with - * LANG=ko on an English version of Windows, the system - * code-page is 1252, but the code-page used by the C library is - * 949. (It's GTK+ itself that sets the C library locale when it - * notices the LANG environment variable. See gtkmain.c The - * Microsoft C library doesn't look at any locale environment - * variables.) We need to pass strftime() a string in the C - * library's code-page. See bug #509885. - */ - locale = setlocale (LC_ALL, NULL); - if (locale != NULL) - dot = strchr (locale, '.'); - if (dot != NULL) - { - codepage = g_ascii_strtoll (dot+1, NULL, 10); - - /* All codepages should fit in 16 bits AFAIK */ - if (codepage > 0 && codepage < 65536) - { - sprintf (charset, "CP%u", (guint) codepage); - locale_format = g_convert (format, -1, charset, "UTF-8", NULL, NULL, NULL); - } - } -#else - locale_format = g_locale_from_utf8 (format, -1, NULL, NULL, NULL); -#endif - if (locale_format != NULL && - strftime (buf, sizeof (buf), locale_format, &tm_mtime) != 0) - { -#ifdef G_OS_WIN32 - /* As above but in opposite direction... */ - if (codepage > 0 && codepage < 65536) - date_str = g_convert (buf, -1, "UTF-8", charset, NULL, NULL, NULL); -#else - date_str = g_locale_to_utf8 (buf, -1, NULL, NULL, NULL); -#endif - } + date_str = g_date_time_format (time, format); - if (date_str == NULL) - date_str = g_strdup (_("Unknown")); + g_date_time_unref (time); + g_date_time_unref (now); - g_free (locale_format); return date_str; } |