diff --git a/src/backend/utils/adt/pg_locale.c b/src/backend/utils/adt/pg_locale.c
index 6e33d65340..f54ce21447 100644
--- a/src/backend/utils/adt/pg_locale.c
+++ b/src/backend/utils/adt/pg_locale.c
@@ -760,7 +760,7 @@ strftime_win32(char *dst, size_t dstlen,
 
 /* Subroutine for cache_locale_time(). */
 static void
-cache_single_time(char **dst, const char *format, const struct tm *tm)
+cache_single_time(char **dst, const char *format, const struct tm *tm, int encoding)
 {
 	char		buf[MAX_L10N_DATA];
 	char	   *ptr;
@@ -777,7 +777,10 @@ cache_single_time(char **dst, const char *format, const struct tm *tm)
 	if (strftime(buf, MAX_L10N_DATA, format, tm) <= 0)
 		elog(ERROR, "strftime(%s) failed: %m", format);
 
-	ptr = MemoryContextStrdup(TopMemoryContext, buf);
+	/* convert the string to the database encoding */
+	ptr = pg_any_to_server(buf, strlen(buf), encoding);
+
+	ptr = MemoryContextStrdup(TopMemoryContext, ptr);
 	if (*dst)
 		pfree(*dst);
 	*dst = ptr;
@@ -792,7 +795,8 @@ cache_locale_time(void)
 	char	   *save_lc_time;
 	time_t		timenow;
 	struct tm  *timeinfo;
-	int			i;
+	int			i,
+				encoding;
 
 #ifdef WIN32
 	char	   *save_lc_ctype;
@@ -830,6 +834,7 @@ cache_locale_time(void)
 #endif
 
 	setlocale(LC_TIME, locale_time);
+	encoding = pg_get_encoding_from_locale(locale_time, true);
 
 	timenow = time(NULL);
 	timeinfo = localtime(&timenow);
@@ -838,8 +843,8 @@ cache_locale_time(void)
 	for (i = 0; i < 7; i++)
 	{
 		timeinfo->tm_wday = i;
-		cache_single_time(&localized_abbrev_days[i], "%a", timeinfo);
-		cache_single_time(&localized_full_days[i], "%A", timeinfo);
+		cache_single_time(&localized_abbrev_days[i], "%a", timeinfo, encoding);
+		cache_single_time(&localized_full_days[i], "%A", timeinfo, encoding);
 	}
 
 	/* localized months */
@@ -847,8 +852,8 @@ cache_locale_time(void)
 	{
 		timeinfo->tm_mon = i;
 		timeinfo->tm_mday = 1;	/* make sure we don't have invalid date */
-		cache_single_time(&localized_abbrev_months[i], "%b", timeinfo);
-		cache_single_time(&localized_full_months[i], "%B", timeinfo);
+		cache_single_time(&localized_abbrev_months[i], "%b", timeinfo, encoding);
+		cache_single_time(&localized_full_months[i], "%B", timeinfo, encoding);
 	}
 
 	/* try to restore internal settings */
diff --git a/src/test/regress/expected/collate.linux.utf8.out b/src/test/regress/expected/collate.linux.utf8.out
index 15b3222239..7449959ef9 100644
--- a/src/test/regress/expected/collate.linux.utf8.out
+++ b/src/test/regress/expected/collate.linux.utf8.out
@@ -430,16 +430,17 @@ SELECT relname FROM pg_class WHERE relname ~* '^abc';
 
 -- to_char
 SET lc_time TO 'tr_TR';
-SELECT to_char(date '2010-04-01', 'DD TMMON YYYY');
+SELECT to_char(date '2010-02-01', 'DD TMMON YYYY');
    to_char   
 -------------
- 01 NIS 2010
+ 01 ŞUB 2010
 (1 row)
 
-SELECT to_char(date '2010-04-01', 'DD TMMON YYYY' COLLATE "tr_TR");
-   to_char   
--------------
- 01 NİS 2010
+SELECT to_char(date '2010-04-01', 'DD TMMON YYYY'),
+to_char(date '2010-04-01', 'DD TMMON YYYY' COLLATE "tr_TR");
+   to_char   |   to_char   
+-------------+-------------
+ 01 NIS 2010 | 01 NİS 2010
 (1 row)
 
 -- backwards parsing
diff --git a/src/test/regress/sql/collate.linux.utf8.sql b/src/test/regress/sql/collate.linux.utf8.sql
index 4ca02b821d..6f1035ff3a 100644
--- a/src/test/regress/sql/collate.linux.utf8.sql
+++ b/src/test/regress/sql/collate.linux.utf8.sql
@@ -167,10 +167,10 @@ SELECT relname FROM pg_class WHERE relname ~* '^abc';
 
 
 -- to_char
-
 SET lc_time TO 'tr_TR';
-SELECT to_char(date '2010-04-01', 'DD TMMON YYYY');
-SELECT to_char(date '2010-04-01', 'DD TMMON YYYY' COLLATE "tr_TR");
+SELECT to_char(date '2010-02-01', 'DD TMMON YYYY');
+SELECT to_char(date '2010-04-01', 'DD TMMON YYYY'),
+to_char(date '2010-04-01', 'DD TMMON YYYY' COLLATE "tr_TR");
 
 
 -- backwards parsing
