@@ -542,10 +542,10 @@ private void handleDateTimeFormatPatterns(String[] patternKeys, Map<String, Obje
542542 if (pattern != null ) {
543543 // Perform date-time format pattern conversion which is
544544 // applicable to both SimpleDateFormat and j.t.f.DateTimeFormatter.
545- String transPattern = translateDateFormatLetters (calendarType , pattern , this ::convertDateTimePatternLetter );
545+ String transPattern = translateDateFormatLetters (calendarType , key , pattern , this ::convertDateTimePatternLetter );
546546 dateTimePatterns .add (i , transPattern );
547547 // Additionally, perform SDF specific date-time format pattern conversion
548- sdfPatterns .add (i , translateDateFormatLetters (calendarType , transPattern , this ::convertSDFLetter ));
548+ sdfPatterns .add (i , translateDateFormatLetters (calendarType , key , transPattern , this ::convertSDFLetter ));
549549 } else {
550550 dateTimePatterns .add (i , null );
551551 sdfPatterns .add (i , null );
@@ -568,7 +568,7 @@ private void handleDateTimeFormatPatterns(String[] patternKeys, Map<String, Obje
568568 }
569569 }
570570
571- private String translateDateFormatLetters (CalendarType calendarType , String cldrFormat , ConvertDateTimeLetters converter ) {
571+ private String translateDateFormatLetters (CalendarType calendarType , String patternKey , String cldrFormat , ConvertDateTimeLetters converter ) {
572572 String pattern = cldrFormat ;
573573 int length = pattern .length ();
574574 boolean inQuote = false ;
@@ -587,7 +587,7 @@ private String translateDateFormatLetters(CalendarType calendarType, String cldr
587587 if (nextc == '\'' ) {
588588 i ++;
589589 if (count != 0 ) {
590- converter .convert (calendarType , lastLetter , count , jrePattern );
590+ converter .convert (calendarType , patternKey , lastLetter , count , jrePattern );
591591 lastLetter = 0 ;
592592 count = 0 ;
593593 }
@@ -597,7 +597,7 @@ private String translateDateFormatLetters(CalendarType calendarType, String cldr
597597 }
598598 if (!inQuote ) {
599599 if (count != 0 ) {
600- converter .convert (calendarType , lastLetter , count , jrePattern );
600+ converter .convert (calendarType , patternKey , lastLetter , count , jrePattern );
601601 lastLetter = 0 ;
602602 count = 0 ;
603603 }
@@ -614,7 +614,7 @@ private String translateDateFormatLetters(CalendarType calendarType, String cldr
614614 }
615615 if (!(c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z' )) {
616616 if (count != 0 ) {
617- converter .convert (calendarType , lastLetter , count , jrePattern );
617+ converter .convert (calendarType , patternKey , lastLetter , count , jrePattern );
618618 lastLetter = 0 ;
619619 count = 0 ;
620620 }
@@ -627,7 +627,7 @@ private String translateDateFormatLetters(CalendarType calendarType, String cldr
627627 count ++;
628628 continue ;
629629 }
630- converter .convert (calendarType , lastLetter , count , jrePattern );
630+ converter .convert (calendarType , patternKey , lastLetter , count , jrePattern );
631631 lastLetter = c ;
632632 count = 1 ;
633633 }
@@ -637,7 +637,7 @@ private String translateDateFormatLetters(CalendarType calendarType, String cldr
637637 }
638638
639639 if (count != 0 ) {
640- converter .convert (calendarType , lastLetter , count , jrePattern );
640+ converter .convert (calendarType , patternKey , lastLetter , count , jrePattern );
641641 }
642642 if (cldrFormat .contentEquals (jrePattern )) {
643643 return cldrFormat ;
@@ -661,7 +661,7 @@ private String toMetaZoneKey(String tzKey) {
661661 * on the support given by the SimpleDateFormat and the j.t.f.DateTimeFormatter
662662 * for date-time formatting.
663663 */
664- private void convertDateTimePatternLetter (CalendarType calendarType , char cldrLetter , int count , StringBuilder sb ) {
664+ private void convertDateTimePatternLetter (CalendarType calendarType , String patternKey , char cldrLetter , int count , StringBuilder sb ) {
665665 switch (cldrLetter ) {
666666 case 'u' :
667667 case 'U' :
@@ -683,7 +683,7 @@ private void convertDateTimePatternLetter(CalendarType calendarType, char cldrLe
683683 * Perform a conversion of CLDR date-time format pattern letter which is
684684 * specific to the SimpleDateFormat.
685685 */
686- private void convertSDFLetter (CalendarType calendarType , char cldrLetter , int count , StringBuilder sb ) {
686+ private void convertSDFLetter (CalendarType calendarType , String patternKey , char cldrLetter , int count , StringBuilder sb ) {
687687 switch (cldrLetter ) {
688688 case 'G' :
689689 if (calendarType != CalendarType .GREGORIAN ) {
@@ -722,6 +722,17 @@ private void convertSDFLetter(CalendarType calendarType, char cldrLetter, int co
722722 appendN ('z' , count , sb );
723723 break ;
724724
725+ case 'y' :
726+ // If the style is FULL/LONG for a Japanese Calendar, make the
727+ // count == 4 for Gan-nen
728+ if (calendarType == CalendarType .JAPANESE &&
729+ (patternKey .contains ("full-" ) ||
730+ patternKey .contains ("long-" ))) {
731+ count = 4 ;
732+ }
733+ appendN (cldrLetter , count , sb );
734+ break ;
735+
725736 case 'Z' :
726737 if (count == 4 || count == 5 ) {
727738 sb .append ("XXX" );
@@ -767,6 +778,7 @@ private void handleSkeletonPatterns(Map<String, Object> myMap, CalendarType cale
767778 .collect (Collectors .toMap (
768779 e -> calendarPrefix + e .getKey (),
769780 e -> translateDateFormatLetters (calendarType ,
781+ e .getKey (),
770782 (String )e .getValue (),
771783 this ::convertDateTimePatternLetter )
772784 ))
@@ -775,7 +787,7 @@ private void handleSkeletonPatterns(Map<String, Object> myMap, CalendarType cale
775787
776788 @ FunctionalInterface
777789 private interface ConvertDateTimeLetters {
778- void convert (CalendarType calendarType , char cldrLetter , int count , StringBuilder sb );
790+ void convert (CalendarType calendarType , String patternKey , char cldrLetter , int count , StringBuilder sb );
779791 }
780792
781793 /**
0 commit comments