@@ -239,10 +239,10 @@ private static List<PatternSequence> sequencePattern(final String pattern) {
239
239
final PatternSequence sequence ;
240
240
switch (c ) {
241
241
case 's' :
242
- sequence = new SecondPatternSequence (true , "" , 0 );
242
+ sequence = new SecondPatternSequence (sequenceContent . length () , "" , 0 );
243
243
break ;
244
244
case 'S' :
245
- sequence = new SecondPatternSequence (false , "" , sequenceContent .length ());
245
+ sequence = new SecondPatternSequence (0 , "" , sequenceContent .length ());
246
246
break ;
247
247
default :
248
248
sequence = new DynamicPatternSequence (sequenceContent );
@@ -694,39 +694,50 @@ static class SecondPatternSequence extends PatternSequence {
694
694
100_000_000 , 10_000_000 , 1_000_000 , 100_000 , 10_000 , 1_000 , 100 , 10 , 1
695
695
};
696
696
697
- private final boolean printSeconds ;
697
+ private final int secondDigits ;
698
698
private final String separator ;
699
699
private final int fractionalDigits ;
700
700
701
- SecondPatternSequence (boolean printSeconds , String separator , int fractionalDigits ) {
701
+ SecondPatternSequence (int secondDigits , String separator , int fractionalDigits ) {
702
702
super (
703
- createPattern (printSeconds , separator , fractionalDigits ),
704
- determinePrecision (printSeconds , fractionalDigits ));
705
- this .printSeconds = printSeconds ;
703
+ createPattern (secondDigits , separator , fractionalDigits ),
704
+ determinePrecision (secondDigits , fractionalDigits ));
705
+ final int maxSecondDigits = 2 ;
706
+ if (secondDigits > maxSecondDigits ) {
707
+ final String message = String .format (
708
+ "More than %d `s` pattern letters are not supported, found: %d" , maxSecondDigits , secondDigits );
709
+ throw new IllegalArgumentException (message );
710
+ }
711
+ final int maxFractionalDigits = 9 ;
712
+ if (fractionalDigits > maxFractionalDigits ) {
713
+ final String message = String .format (
714
+ "More than %d `S` pattern letters are not supported, found: %d" ,
715
+ maxFractionalDigits , fractionalDigits );
716
+ throw new IllegalArgumentException (message );
717
+ }
718
+ this .secondDigits = secondDigits ;
706
719
this .separator = separator ;
707
720
this .fractionalDigits = fractionalDigits ;
708
721
}
709
722
710
- private static String createPattern (boolean printSeconds , String separator , int fractionalDigits ) {
711
- StringBuilder builder = new StringBuilder ();
712
- if (printSeconds ) {
713
- builder .append ("ss" );
714
- }
715
- builder .append (StaticPatternSequence .escapeLiteral (separator ));
716
- if (fractionalDigits > 0 ) {
717
- builder .append (Strings .repeat ("S" , fractionalDigits ));
718
- }
719
- return builder .toString ();
723
+ private static String createPattern (int secondDigits , String separator , int fractionalDigits ) {
724
+ return Strings .repeat ("s" , secondDigits )
725
+ + StaticPatternSequence .escapeLiteral (separator )
726
+ + Strings .repeat ("S" , fractionalDigits );
720
727
}
721
728
722
- private static ChronoUnit determinePrecision (boolean printSeconds , int digits ) {
729
+ private static ChronoUnit determinePrecision (int secondDigits , int digits ) {
723
730
if (digits > 6 ) return ChronoUnit .NANOS ;
724
731
if (digits > 3 ) return ChronoUnit .MICROS ;
725
732
if (digits > 0 ) return ChronoUnit .MILLIS ;
726
- return printSeconds ? ChronoUnit .SECONDS : ChronoUnit .FOREVER ;
733
+ return secondDigits > 0 ? ChronoUnit .SECONDS : ChronoUnit .FOREVER ;
734
+ }
735
+
736
+ private static void formatUnpaddedSeconds (StringBuilder buffer , Instant instant ) {
737
+ buffer .append (instant .getEpochSecond () % 60L );
727
738
}
728
739
729
- private static void formatSeconds (StringBuilder buffer , Instant instant ) {
740
+ private static void formatPaddedSeconds (StringBuilder buffer , Instant instant ) {
730
741
long secondsInMinute = instant .getEpochSecond () % 60L ;
731
742
buffer .append ((char ) ((secondsInMinute / 10L ) + '0' ));
732
743
buffer .append ((char ) ((secondsInMinute % 10L ) + '0' ));
@@ -757,9 +768,12 @@ private static void formatMillis(StringBuilder buffer, Instant instant) {
757
768
758
769
@ Override
759
770
InstantPatternFormatter createFormatter (Locale locale , TimeZone timeZone ) {
771
+ final BiConsumer <StringBuilder , Instant > secondDigitsFormatter = secondDigits == 2
772
+ ? SecondPatternSequence ::formatPaddedSeconds
773
+ : SecondPatternSequence ::formatUnpaddedSeconds ;
760
774
final BiConsumer <StringBuilder , Instant > fractionDigitsFormatter =
761
775
fractionalDigits == 3 ? SecondPatternSequence ::formatMillis : this ::formatFractionalDigits ;
762
- if (! printSeconds ) {
776
+ if (secondDigits == 0 ) {
763
777
return new AbstractFormatter (pattern , locale , timeZone , precision ) {
764
778
@ Override
765
779
public void formatTo (StringBuilder buffer , Instant instant ) {
@@ -772,15 +786,15 @@ public void formatTo(StringBuilder buffer, Instant instant) {
772
786
return new AbstractFormatter (pattern , locale , timeZone , precision ) {
773
787
@ Override
774
788
public void formatTo (StringBuilder buffer , Instant instant ) {
775
- formatSeconds (buffer , instant );
789
+ secondDigitsFormatter . accept (buffer , instant );
776
790
buffer .append (separator );
777
791
}
778
792
};
779
793
}
780
794
return new AbstractFormatter (pattern , locale , timeZone , precision ) {
781
795
@ Override
782
796
public void formatTo (StringBuilder buffer , Instant instant ) {
783
- formatSeconds (buffer , instant );
797
+ secondDigitsFormatter . accept (buffer , instant );
784
798
buffer .append (separator );
785
799
fractionDigitsFormatter .accept (buffer , instant );
786
800
}
@@ -795,15 +809,15 @@ PatternSequence tryMerge(PatternSequence other, ChronoUnit thresholdPrecision) {
795
809
StaticPatternSequence staticOther = (StaticPatternSequence ) other ;
796
810
if (fractionalDigits == 0 ) {
797
811
return new SecondPatternSequence (
798
- printSeconds , this .separator + staticOther .literal , fractionalDigits );
812
+ this . secondDigits , this .separator + staticOther .literal , fractionalDigits );
799
813
}
800
814
}
801
815
// We can always append more fractional digits
802
816
if (other instanceof SecondPatternSequence ) {
803
817
SecondPatternSequence secondOther = (SecondPatternSequence ) other ;
804
- if (! secondOther .printSeconds && secondOther .separator .isEmpty ()) {
818
+ if (secondOther .secondDigits == 0 && secondOther .separator .isEmpty ()) {
805
819
return new SecondPatternSequence (
806
- printSeconds , this .separator , this .fractionalDigits + secondOther .fractionalDigits );
820
+ this . secondDigits , this .separator , this .fractionalDigits + secondOther .fractionalDigits );
807
821
}
808
822
}
809
823
return null ;
0 commit comments