diff --git a/time/Makefile b/time/Makefile
index ec3e39dcea..6dc2acceaa 100644
--- a/time/Makefile
+++ b/time/Makefile
@@ -43,7 +43,7 @@ tests	:= test_time clocktest tst-posixtz tst-strptime tst_wcsftime \
 	   tst-getdate tst-mktime tst-mktime2 tst-ftime_l tst-strftime \
 	   tst-mktime3 tst-strptime2 bug-asctime bug-asctime_r bug-mktime1 \
 	   tst-strptime3 bug-getdate1 tst-strptime-whitespace tst-ftime \
-	   tst-tzname tst-y2039
+	   tst-tzname tst-y2039 tst-strftime2
 
 include ../Rules
 
diff --git a/time/strftime_l.c b/time/strftime_l.c
index c71f9f47a9..0030b631fa 100644
--- a/time/strftime_l.c
+++ b/time/strftime_l.c
@@ -100,6 +100,9 @@ extern char *tzname[];
 
 # define MEMCPY(d, s, n) __wmemcpy (d, s, n)
 # define STRLEN(s) __wcslen (s)
+# define STRCPY wcscpy
+# define STRSTR wcsstr
+# define MEMMOVE wmemmove
 
 #else
 # define CHAR_T char
@@ -114,6 +117,9 @@ extern char *tzname[];
 #  define MEMCPY(d, s, n) memcpy ((d), (s), (n))
 # endif
 # define STRLEN(s) strlen (s)
+# define STRCPY strcpy
+# define STRSTR strstr
+# define MEMMOVE memmove
 
 # ifdef _LIBC
 #  define MEMPCPY(d, s, n) __mempcpy (d, s, n)
@@ -233,7 +239,11 @@ static const CHAR_T zeroes[16] = /* "0000000000000000" */
       int _delta = width - _n;						      \
       int _incr = _n + (_delta > 0 ? _delta : 0);			      \
       if ((size_t) _incr >= maxsize - i)				      \
-	return 0;							      \
+	{								      \
+	  if (using_malloc)						      \
+	    free (subfmt2);						      \
+	  return 0;							      \
+	}								      \
       if (p)								      \
 	{								      \
 	  if (_delta > 0)						      \
@@ -574,6 +584,8 @@ __strftime_internal (CHAR_T *s, size_t maxsize, const CHAR_T *format,
       int to_uppcase = 0;
       int change_case = 0;
       int format_char;
+      CHAR_T *subfmt2;
+      bool using_malloc = false;
 
 #if DO_MULTIBYTE && !defined COMPILE_WIDE
       switch (*f)
@@ -820,7 +832,7 @@ __strftime_internal (CHAR_T *s, size_t maxsize, const CHAR_T *format,
 	  if (modifier == L_('O'))
 	    goto bad_format;
 #ifdef _NL_CURRENT
-	  if (! (modifier == 'E'
+	  if (! (modifier == L_('E')
 		 && (*(subfmt =
 		       (const CHAR_T *) _NL_CURRENT (LC_TIME,
 						     NLW(ERA_D_T_FMT)))
@@ -843,6 +855,11 @@ __strftime_internal (CHAR_T *s, size_t maxsize, const CHAR_T *format,
 	    add (len, __strftime_internal (p, maxsize - i, subfmt,
 					   tp, tzset_called ut_argument
 					   LOCALE_ARG));
+	    if (using_malloc)
+	      {
+		free (subfmt2);
+		using_malloc = false;
+	      }
 
 	    if (to_uppcase)
 	      while (old_start < p)
@@ -917,7 +934,7 @@ __strftime_internal (CHAR_T *s, size_t maxsize, const CHAR_T *format,
 #ifdef _NL_CURRENT
 	  if (! (modifier == L_('E')
 		 && (*(subfmt =
-		       (const CHAR_T *)_NL_CURRENT (LC_TIME, NLW(ERA_D_FMT)))
+		       (const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(ERA_D_FMT)))
 		     != L_('\0'))))
 	    subfmt = (const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(D_FMT));
 	  goto subformat;
@@ -1262,7 +1279,7 @@ __strftime_internal (CHAR_T *s, size_t maxsize, const CHAR_T *format,
 	  DO_NUMBER (1, tp->tm_wday);
 
 	case L_('Y'):
-	  if (modifier == 'E')
+	  if (modifier == L_('E'))
 	    {
 #if HAVE_STRUCT_ERA_ENTRY
 	      struct era_entry *era = _nl_get_era_entry (tp HELPER_LOCALE_ARG);
@@ -1273,6 +1290,32 @@ __strftime_internal (CHAR_T *s, size_t maxsize, const CHAR_T *format,
 # else
 		  subfmt = era->era_format;
 # endif
+		  if (pad != 0)
+		    {
+		      CHAR_T *flag;
+
+		      if (__libc_use_alloca ((STRLEN (subfmt) + 2)
+					     * sizeof (CHAR_T)))
+			subfmt2 = (CHAR_T *) alloca ((STRLEN (subfmt) + 2)
+						     * sizeof (CHAR_T));
+		      else
+			{
+			  if ((subfmt2 =
+			      (CHAR_T *) malloc ((STRLEN (subfmt) + 2)
+						 * sizeof (CHAR_T))) == NULL)
+			    goto subformat;
+			  using_malloc = true;
+			}
+		      STRCPY (subfmt2, subfmt);
+		      if ((flag = STRSTR (subfmt2, L_("%Ey"))) != NULL)
+			{
+			  MEMMOVE (flag + 2 * sizeof (CHAR_T),
+				   flag + sizeof (CHAR_T), STRLEN (flag));
+			  *(flag + sizeof (CHAR_T)) = (CHAR_T) pad;
+			  subfmt = subfmt2;
+			  pad = 0;
+			}
+		    }
 		  goto subformat;
 		}
 #else
@@ -1294,7 +1337,7 @@ __strftime_internal (CHAR_T *s, size_t maxsize, const CHAR_T *format,
 	      if (era)
 		{
 		  int delta = tp->tm_year - era->start_date[0];
-		  DO_NUMBER (1, (era->offset
+		  DO_NUMBER (2, (era->offset
 				 + delta * era->absolute_direction));
 		}
 #else
diff --git a/time/tst-strftime2.c b/time/tst-strftime2.c
new file mode 100644
index 0000000000..3e7ddfe9ea
--- /dev/null
+++ b/time/tst-strftime2.c
@@ -0,0 +1,134 @@
+/* Verify the behavior of strftime on alternate representation for year.
+
+   Copyright (C) 2013-2018 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <locale.h>
+#include <time.h>
+#include <stdio.h>
+#include <string.h>
+
+static const char *locales[] = { "ja_JP.UTF-8", "lo_LA.UTF-8", "th_TH.UTF-8" };
+#define nlocales (sizeof (locales) / sizeof (locales[0]))
+
+static const char *formats[] = { "%EY", "%_EY", "%-EY" };
+#define nformats (sizeof (formats) / sizeof (formats[0]))
+
+static const struct
+{
+  const int d, m, y;
+} dates[] =
+  {
+    { 1, 3, 88 },
+    { 7, 0, 89 },
+    { 8, 0, 89 },
+    { 1, 3, 90 },
+    { 1, 3, 97 },
+    { 1, 3, 98 }
+  };
+#define ndates (sizeof (dates) / sizeof (dates[0]))
+
+static char ref[nlocales][nformats][ndates][100];
+
+static void
+mkreftable (void)
+{
+  int i, j, k;
+  char era[10];
+  static const int yrj[] = { 63, 64, 1, 2, 9, 10 };
+  static const int yrb[] = { 2531, 2532, 2532, 2533, 2540, 2541 };
+
+  for (i = 0; i < nlocales; i++)
+    for (j = 0; j < nformats; j++)
+      for (k = 0; k < ndates; k++)
+	{
+	  if (i == 0)
+	    {
+	      sprintf (era, "%s", (k < 2) ? "\xe6\x98\xad\xe5\x92\x8c"
+					  : "\xe5\xb9\xb3\xe6\x88\x90");
+	      if (yrj[k] == 1)
+		sprintf (ref[i][j][k], "%s\xe5\x85\x83\xe5\xb9\xb4", era);
+	      else
+		{
+		  if (j == 0)
+		    sprintf (ref[i][j][k], "%s%02d\xe5\xb9\xb4", era, yrj[k]);
+		  else if (j == 1)
+		    sprintf (ref[i][j][k], "%s%2d\xe5\xb9\xb4", era, yrj[k]);
+		  else
+		    sprintf (ref[i][j][k], "%s%d\xe5\xb9\xb4", era, yrj[k]);
+		}
+	    }
+	  else if (i == 1)
+	    {
+	      sprintf (era, "\xe0\xba\x9e\x2e\xe0\xba\xaa\x2e ");
+	      sprintf (ref[i][j][k], "%s%d", era, yrb[k]);
+	    }
+	  else
+	    {
+	      sprintf (era, "\xe0\xb8\x9e\x2e\xe0\xb8\xa8\x2e ");
+	      sprintf (ref[i][j][k], "%s%d", era, yrb[k]);
+	    }
+	}
+}
+
+static int
+do_test (void)
+{
+  int i, j, k, result = 0;
+  struct tm ttm;
+  char date[11], buf[100];
+  size_t r, e;
+
+  mkreftable ();
+  for (i = 0; i < nlocales; i++)
+    {
+      if (setlocale (LC_ALL, locales[i]) == NULL)
+	{
+	  printf ("locale %s does not exist, skipping...\n", locales[i]);
+	  continue;
+	}
+      printf ("[%s]\n", locales[i]);
+      for (j = 0; j < nformats; j++)
+	{
+	  for (k = 0; k < ndates; k++)
+	    {
+	      ttm.tm_mday = dates[k].d;
+	      ttm.tm_mon  = dates[k].m;
+	      ttm.tm_year = dates[k].y;
+	      strftime (date, sizeof (date), "%F", &ttm);
+	      r = strftime (buf, sizeof (buf), formats[j], &ttm);
+	      e = strlen (ref[i][j][k]);
+	      printf ("%s\t\"%s\"\t\"%s\"", date, formats[j], buf);
+	      if (strcmp (buf, ref[i][j][k]) != 0)
+		{
+		  printf ("\tshould be \"%s\"", ref[i][j][k]);
+		  if (r != e)
+		    printf ("\tgot: %zu, expected: %zu", r, e);
+		  result = 1;
+		}
+	      else
+		printf ("\tOK");
+	      putchar ('\n');
+	    }
+	  putchar ('\n');
+	}
+    }
+  return result;
+}
+
+#define TEST_FUNCTION do_test ()
+#include "../test-skeleton.c"
