@@ -239,14 +239,10 @@ private static List<PatternSequence> sequencePattern(final String pattern) {
239239 final PatternSequence sequence ;
240240 switch (c ) {
241241 case 's' :
242- if (sequenceContent .length () == 2 ) {
243- sequence = new SecondPatternSequence (true , "" , 0 );
244- } else {
245- sequence = new DynamicPatternSequence (sequenceContent );
246- }
242+ sequence = new SecondPatternSequence (sequenceContent .length (), "" , 0 );
247243 break ;
248244 case 'S' :
249- sequence = new SecondPatternSequence (false , "" , sequenceContent .length ());
245+ sequence = new SecondPatternSequence (0 , "" , sequenceContent .length ());
250246 break ;
251247 default :
252248 sequence = new DynamicPatternSequence (sequenceContent );
@@ -698,39 +694,50 @@ static class SecondPatternSequence extends PatternSequence {
698694 100_000_000 , 10_000_000 , 1_000_000 , 100_000 , 10_000 , 1_000 , 100 , 10 , 1
699695 };
700696
701- private final boolean printSeconds ;
697+ private final int secondDigits ;
702698 private final String separator ;
703699 private final int fractionalDigits ;
704700
705- SecondPatternSequence (boolean printSeconds , String separator , int fractionalDigits ) {
701+ SecondPatternSequence (int secondDigits , String separator , int fractionalDigits ) {
706702 super (
707- createPattern (printSeconds , separator , fractionalDigits ),
708- determinePrecision (printSeconds , fractionalDigits ));
709- this .printSeconds = printSeconds ;
703+ createPattern (secondDigits , separator , fractionalDigits ),
704+ determinePrecision (secondDigits , fractionalDigits ));
705+ if (secondDigits < 0 || secondDigits > 2 ) {
706+ throw new IllegalArgumentException ("Unsupported number of `s` pattern letters." );
707+ }
708+ if (fractionalDigits > 9 ) {
709+ throw new IllegalArgumentException ("Unsupported number of `S` pattern letters." );
710+ }
711+ this .secondDigits = secondDigits ;
710712 this .separator = separator ;
711713 this .fractionalDigits = fractionalDigits ;
712714 }
713715
714- private static String createPattern (boolean printSeconds , String separator , int fractionalDigits ) {
715- StringBuilder builder = new StringBuilder ();
716- if (printSeconds ) {
717- builder .append ("ss" );
718- }
719- builder .append (StaticPatternSequence .escapeLiteral (separator ));
720- if (fractionalDigits > 0 ) {
721- builder .append (Strings .repeat ("S" , fractionalDigits ));
722- }
723- return builder .toString ();
716+ private static String createPattern (int secondDigits , String separator , int fractionalDigits ) {
717+ return Strings .repeat ("s" , secondDigits )
718+ + StaticPatternSequence .escapeLiteral (separator )
719+ + Strings .repeat ("S" , fractionalDigits );
724720 }
725721
726- private static ChronoUnit determinePrecision (boolean printSeconds , int digits ) {
722+ private static ChronoUnit determinePrecision (int secondDigits , int digits ) {
727723 if (digits > 6 ) return ChronoUnit .NANOS ;
728724 if (digits > 3 ) return ChronoUnit .MICROS ;
729725 if (digits > 0 ) return ChronoUnit .MILLIS ;
730- return printSeconds ? ChronoUnit .SECONDS : ChronoUnit .FOREVER ;
726+ return secondDigits > 0 ? ChronoUnit .SECONDS : ChronoUnit .FOREVER ;
727+ }
728+
729+ private void formatSeconds (StringBuilder buffer , Instant instant ) {
730+ switch (secondDigits ) {
731+ case 1 :
732+ buffer .append (instant .getEpochSecond () % 60L );
733+ break ;
734+ case 2 :
735+ formatPaddedSeconds (buffer , instant );
736+ break ;
737+ }
731738 }
732739
733- private static void formatSeconds (StringBuilder buffer , Instant instant ) {
740+ private static void formatPaddedSeconds (StringBuilder buffer , Instant instant ) {
734741 long secondsInMinute = instant .getEpochSecond () % 60L ;
735742 buffer .append ((char ) ((secondsInMinute / 10L ) + '0' ));
736743 buffer .append ((char ) ((secondsInMinute % 10L ) + '0' ));
@@ -761,9 +768,11 @@ private static void formatMillis(StringBuilder buffer, Instant instant) {
761768
762769 @ Override
763770 InstantPatternFormatter createFormatter (Locale locale , TimeZone timeZone ) {
771+ final BiConsumer <StringBuilder , Instant > secondDigitsFormatter =
772+ secondDigits == 2 ? SecondPatternSequence ::formatPaddedSeconds : this ::formatSeconds ;
764773 final BiConsumer <StringBuilder , Instant > fractionDigitsFormatter =
765774 fractionalDigits == 3 ? SecondPatternSequence ::formatMillis : this ::formatFractionalDigits ;
766- if (! printSeconds ) {
775+ if (secondDigits == 0 ) {
767776 return new AbstractFormatter (pattern , locale , timeZone , precision ) {
768777 @ Override
769778 public void formatTo (StringBuilder buffer , Instant instant ) {
@@ -776,15 +785,15 @@ public void formatTo(StringBuilder buffer, Instant instant) {
776785 return new AbstractFormatter (pattern , locale , timeZone , precision ) {
777786 @ Override
778787 public void formatTo (StringBuilder buffer , Instant instant ) {
779- formatSeconds (buffer , instant );
788+ secondDigitsFormatter . accept (buffer , instant );
780789 buffer .append (separator );
781790 }
782791 };
783792 }
784793 return new AbstractFormatter (pattern , locale , timeZone , precision ) {
785794 @ Override
786795 public void formatTo (StringBuilder buffer , Instant instant ) {
787- formatSeconds (buffer , instant );
796+ secondDigitsFormatter . accept (buffer , instant );
788797 buffer .append (separator );
789798 fractionDigitsFormatter .accept (buffer , instant );
790799 }
@@ -799,15 +808,15 @@ PatternSequence tryMerge(PatternSequence other, ChronoUnit thresholdPrecision) {
799808 StaticPatternSequence staticOther = (StaticPatternSequence ) other ;
800809 if (fractionalDigits == 0 ) {
801810 return new SecondPatternSequence (
802- printSeconds , this .separator + staticOther .literal , fractionalDigits );
811+ this . secondDigits , this .separator + staticOther .literal , fractionalDigits );
803812 }
804813 }
805814 // We can always append more fractional digits
806815 if (other instanceof SecondPatternSequence ) {
807816 SecondPatternSequence secondOther = (SecondPatternSequence ) other ;
808- if (! secondOther .printSeconds && secondOther .separator .isEmpty ()) {
817+ if (secondOther .secondDigits == 0 && secondOther .separator .isEmpty ()) {
809818 return new SecondPatternSequence (
810- printSeconds , this .separator , this .fractionalDigits + secondOther .fractionalDigits );
819+ this . secondDigits , this .separator , this .fractionalDigits + secondOther .fractionalDigits );
811820 }
812821 }
813822 return null ;
0 commit comments